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

我目前正在以下面的方式创build整型常量。

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; } 

当我尝试以枚举的方式做到这一点

 public enum PAGE{SIGN_CREATE,SIGN_CREATE,HOME_SCREEN,REGISTER_SCREEN} 

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

那么,你不能这样做。 PAGE.SIGN_CREATE永远不会返回1; 它会返回PAGE.SIGN_CREATE 。 这是枚举types的一点。

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

 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; } } 

然后你调用PAGE.SIGN_CREATE.getValue()得到0。

想要一个与每个枚举值相关的整数常量的最常见的正当理由是与仍然期望这些整数的其他组件互操作(例如,不能更改的序列化协议,或枚举表示列中的列等) 。

在几乎所有情况下,我build议使用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); 

这通常也是非常有效的。

把这样的数据添加到枚举实例本身可能是非常强大的,但往往不被滥用。

编辑:刚刚意识到布洛赫在有效的Java /第二版,在项目33:使用EnumMap而不是序数索引

你可以使用序号 。 所以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; } } 

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

你可以把这个const值存储在枚举中。 但为什么即使使用const? 你坚持枚举吗?

 public class SO3990319 { public static enum PAGE { SIGN_CREATE(1); private final int constValue; private PAGE(int constValue) { this.constValue = constValue; } public int constValue() { return constValue; } } public static void main(String[] args) { System.out.println("Name: " + PAGE.SIGN_CREATE.name()); System.out.println("Ordinal: " + PAGE.SIGN_CREATE.ordinal()); System.out.println("Const: " + PAGE.SIGN_CREATE.constValue()); System.out.println("Enum: " + PAGE.valueOf("SIGN_CREATE")); } } 

编辑:

这取决于你是使用int的是什么使用EnumMap或实例字段。

  • Bloch on Enum实例字段(Item 31:使用实例字段而不是序号)
  • 枚举映射上的Bloch(Item 33:使用EnumMap而不是序数索引)