View Javadoc
1   package org.itracker.model;
2   
3   /**
4    * An interface to be implemented by java.lang.Enum classes that need
5    * to associate a unique and constant integer code to their enum constants.
6    * <p/>
7    * <p>The main use case is to allow to persist an enum constant to
8    * an integer rather than a string value, which is supported directly
9    * by the java.lang.Enum class through the enum.name() and enum.valueOf(String)
10   * methods. <br>
11   * The enum.ordinal() position could be used, but isn't the best approach for
12   * this use case because we don't have any control on it :
13   * it is zero-based and changes if the position of the enum constant changes.
14   * <br>
15   * Using the enum name isn't satisfactory either because we would have
16   * to update the database if we ever need to rename an enum constant. </p>
17   * <p/>
18   * <p>This class allows to migrate to Java 5 enums retaining full backwards
19   * compatibility with iTracker 2, in which all enumerations were simply defined
20   * as <code>static final int</code> fields. </p>
21   * <p/>
22   * <p>This interface allows to handle all such enums consistently
23   * and to use a single Hibernate custom type to persist them all. </p>
24   *
25   * @author johnny
26   */
27  public interface IntCodeEnum<E extends Enum<E>> {
28  
29      int DEFAULT_CODE = 1;
30  
31      /**
32       * Returns the integer value representing this enum constant.
33       *
34       * @return unique constant as defined in iTracker 2
35       */
36      Integer getCode();
37  
38      /**
39       * Returns a java.lang.Enum constant matching the given integer value.
40       * <p/>
41       * <p>This method should actually be static, so that we don't need
42       * an enum constant instance to lookup another instance by code.
43       * <br>
44       * However Java interfaces don't allow static methods and Java 5 enums
45       * must inherit java.lang.Enum directly. So there's no way to create
46       * a common base class with a static fromCode(int) method
47       * for all enums in our application for EnumCodeUserType to use
48       * in a type-safe way! </p>
49       *
50       * <p>You should instead implement a static valueOf(int) wrapped by this method:
51       * <pre>
52       * static final E valueOf(Integer code) {
53       *     for (E val: values()) {
54       *         if (val.code == code) {
55       *             return val;
56       *         }
57       *     }
58       *     throw new IllegalArgumentException("Unknown code : " + code);
59       * }
60       *
61       * </pre>
62       * </p>
63       *
64       * @param code unique enum constant as defined in iTracker 2
65       * @return java.lang.Enum constant instance for the given code
66       * @throws IllegalArgumentException no matching enum constant for
67       *                                  the given <code>code</code>
68       */
69       E fromCode(Integer code);
70  
71  }