Storing integer values as constants in Enum manner in java

我当前正在以下列方式创建整数常量。

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}

and When i used PAGE.SIGN_CREATE it should return 1;

182104 次浏览

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


}

You can then use getID. So PAGE.SIGN_CREATE.getID() returns 1.

您可以像这样在枚举中存储常量值。但为什么要用常量呢?你在坚持 Enum 的吗?

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

Edit:

这取决于在使用 EnumMap 还是实例字段时使用 int 的内容。

你不能这么做。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; }
}

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

需要一个与每个枚举值相关联的整数常量的最常见的合理原因是与仍然需要这些整数的其他组件进行互操作(例如,无法更改的序列化协议,或枚举表示表中的列,等等)。

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

这也是非常有效率的。

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

编辑: 刚刚意识到 Bloch 在高效 Java/第二版 项目33: 使用 EnumMap代替序号索引中解决了这个问题。

if you want to be able to convert integer back to corresponding enum with selected value see Constants.forValue(...) in below auto generated code but if not the answer of BlairHippo is best way to do it.

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


public static final int SIZE = java.lang.Integer.SIZE;


private int intValue;
private static java.util.HashMap<Integer, Constants> mappings;
private static java.util.HashMap<Integer, Constants> getMappings()
{
if (mappings == null)
{
synchronized (Constants.class)
{
if (mappings == null)
{
mappings = new java.util.HashMap<Integer, Constants>();
}
}
}
return mappings;
}


private Constants(int value)
{
intValue = value;
getMappings().put(value, this);
}


public int getValue()
{
return intValue;
}


public static Constants forValue(int value)
{
return getMappings().get(value);
}
}

我发现这个很有帮助:

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