在java中以Enum方式将整数值存储为常量

Lab*_*lan 95 java enums constants

我目前正在以下列方式创建整数常量.

public class Constants {
    public static int SIGN_CREATE=0;
    public static int SIGN_CREATE=1;
    public static int HOME_SCREEN=2;
    public static int REGISTER_SCREEN=3;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试以枚举方式执行此操作时

public enum PAGE{SIGN_CREATE,SIGN_CREATE,HOME_SCREEN,REGISTER_SCREEN}
Run Code Online (Sandbox Code Playgroud)

当我用PAGE.SIGN_CREATE它时应该返回1;

Bla*_*ppo 176

好吧,你不能那样做. PAGE.SIGN_CREATE永远不会回归1; 它会回来PAGE.SIGN_CREATE.这是枚举类型的重点.

但是,如果您愿意添加几个按键,则可以在枚举中添加字段,如下所示:


    public enum PAGE{
        SIGN_CREATE(0),
        SIGN_CREATE_BONUS(1),
        HOME_SCREEN(2),
        REGISTER_SCREEN(3);

        private final int value;

        PAGE(final int newValue) {
            value = newValue;
        }

        public int getValue() { return value; }
    }
Run Code Online (Sandbox Code Playgroud)

然后你打电话PAGE.SIGN_CREATE.getValue()给0.

  • 事实并非如此.你可以做PAGE.SIGN_CREATE.ordinal().这将返回0.可能这个anwser与一个没有此功能的java版本相关. (7认同)

Mar*_*ers 23

想要与每个枚举值相关联的整数常量的最常见的正当理由是与仍然期望那些整数的其他组件(例如,您无法更改的序列化协议,或者枚举表示表中的列等)进行互操作. .

在几乎所有情况下,我建议使用EnumMap替代.它更完整地分离组件,如果这是关注点,或者如果枚举表示列索引或类似的东西,您可以在以后轻松进行更改(或者甚至在运行时,如果需要).

 private final EnumMap<Page, Integer> pageIndexes = new EnumMap<Page, Integer>(Page.class);
 pageIndexes.put(Page.SIGN_CREATE, 1);
 //etc., ...

 int createIndex = pageIndexes.get(Page.SIGN_CREATE);
Run Code Online (Sandbox Code Playgroud)

它通常也非常高效.

将这样的数据添加到枚举实例本身可能非常强大,但通常不会被滥用.

编辑:刚刚实现了Bloch在Effective Java/2nd edition中的第33项:使用EnumMap而不是序数索引.

  • 这也相当冗长。这意味着您保留一个完全独立的数据结构,只是为了获得从键到派生数字索引的映射。Bloch 还(第 31 条)建议简单的整数索引值使用 @BlairHippo 对此问题的回答中概述的模式。 (2认同)

Ada*_*dam 15

你可以使用序数.所以PAGE.SIGN_CREATE.ordinal()回报1.

编辑:

这样做的唯一问题是,如果添加,删除或重新排序枚举值,您将破坏系统.对于许多人来说,这不是问题,因为他们不会删除枚举,只会在末尾添加其他值.它也不比整数常量差,它也要求你不要重新编号.但是最好使用如下系统:

public enum PAGE{
  SIGN_CREATE0(0), SIGN_CREATE(1) ,HOME_SCREEN(2), REGISTER_SCREEN(3)

  private int id;

  PAGE(int id){
    this.id = id;
  }

  public int getID(){
    return id;
  }

}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用getID.所以PAGE.SIGN_CREATE.getID()回报1.

  • 不好的想法,因为当类声明中的常量顺序发生变化时它会发生变化. (2认同)

Cla*_*ell 7

我发现这很有帮助:

http://dan.clarke.name/2011/07/enum-in-java-with-int-conversion/

public enum Difficulty
{
    EASY(0),
    MEDIUM(1),
    HARD(2);

    /**
    * Value for this difficulty
    */
    public final int Value;

    private Difficulty(int value)
    {
        Value = value;
    }

    // Mapping difficulty to difficulty id
    private static final Map<Integer, Difficulty> _map = new HashMap<Integer, Difficulty>();
    static
    {
        for (Difficulty difficulty : Difficulty.values())
            _map.put(difficulty.Value, difficulty);
    }

    /**
    * Get difficulty from value
    * @param value Value
    * @return Difficulty
    */
    public static Difficulty from(int value)
    {
        return _map.get(value);
    }
}
Run Code Online (Sandbox Code Playgroud)