我可以在Java中设置enum起始值吗?

我使用枚举创建了几个常量:

enum ids {OPEN, CLOSE};

OPEN值为0,但我希望它为100。这可能吗?

274862 次浏览

是的。你可以将数值传递给枚举的构造函数,如下所示:

enum Ids {
OPEN(100),
CLOSE(200);


private int value;


private Ids(int value) {
this.value = value;
}


public int getValue() {
return value;
}
}

更多信息请参见Sun Java语言指南

Java枚举不同于C或c++枚举,后者实际上只是整数的标签。

Java枚举的实现更像类——它们甚至可以有多个属性。

public enum Ids {
OPEN(100), CLOSE(200);


private final int id;
Ids(int id) { this.id = id; }
public int getValue() { return id; }
}

最大的区别是它们是类型安全的,这意味着你不必担心将COLOR枚举分配给SIZE变量。

更多信息请参见http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

如果你使用非常大的枚举类型,那么下面可能会有用;

public enum deneme {


UPDATE, UPDATE_FAILED;


private static Map<Integer, deneme> ss = new TreeMap<Integer,deneme>();
private static final int START_VALUE = 100;
private int value;


static {
for(int i=0;i<values().length;i++)
{
values()[i].value = START_VALUE + i;
ss.put(values()[i].value, values()[i]);
}
}


public static deneme fromInt(int i) {
return ss.get(i);
}


public int value() {
return value;
}
}

用这种方式有什么好处:

public enum HL_COLORS{
YELLOW,
ORANGE;


public int getColorValue() {
switch (this) {
case YELLOW:
return 0xffffff00;
case ORANGE:
return 0xffffa500;
default://YELLOW
return 0xffffff00;
}
}
}

只有一种方法。

你可以使用静态方法并将Enum作为参数传递 如:< / p >

public enum HL_COLORS{
YELLOW,
ORANGE;


public static int getColorValue(HL_COLORS hl) {
switch (hl) {
case YELLOW:
return 0xffffff00;
case ORANGE:
return 0xffffa500;
default://YELLOW
return 0xffffff00;
}
}

注意,这两种方法使用更少的内存和更多的进程单元。我并不是说这是最好的方法,但这只是另一种方法。

如果你想模拟C/ c++的enum(以num为基数,next为增量):

enum ids {
OPEN, CLOSE;
//
private static final int BASE_ORDINAL = 100;
public int getCode() {
return ordinal() + BASE_ORDINAL;
}
};


public class TestEnum {
public static void main (String... args){
for (ids i : new ids[] { ids.OPEN, ids.CLOSE }) {
System.out.println(i.toString() + " " +
i.ordinal() + " " +
i.getCode());
}
}
}
OPEN 0 100
CLOSE 1 101

函数的作用是:返回标识符在枚举中的相对位置。您可以使用它来获得带有偏移量的自动索引,就像使用c风格的enum一样。

例子:

public class TestEnum {
enum ids {
OPEN,
CLOSE,
OTHER;


public final int value = 100 + ordinal();
};


public static void main(String arg[]) {
System.out.println("OPEN:  " + ids.OPEN.value);
System.out.println("CLOSE: " + ids.CLOSE.value);
System.out.println("OTHER: " + ids.OTHER.value);
}
};

给出输出:

OPEN:  100
CLOSE: 101
OTHER: 102

编辑:刚刚意识到这非常类似于ggrandes' answer,但我将把它留在这里,因为它非常干净,几乎接近你可以得到一个C风格的enum。

 public class MyClass {
public static void main(String args[]) {
Ids id1 = Ids.OPEN;
System.out.println(id1.getValue());
}
}


enum Ids {
OPEN(100), CLOSE(200);


private final int id;
Ids(int id) { this.id = id; }
public int getValue() { return id; }
}

@scottf,你可能会感到困惑,因为在ENUM中定义的构造函数。

我来解释一下。

class loader加载enum类时,则enum构造函数也被调用。什么! !是的,它在OPENclose上被调用。100用于OPEN200用于close

我能有不同的价值吗?

是的,

public class MyClass {
public static void main(String args[]) {
Ids id1 = Ids.OPEN;
id1.setValue(2);
System.out.println(id1.getValue());
}
}


enum Ids {
OPEN(100), CLOSE(200);


private int id;
Ids(int id) { this.id = id; }
public int getValue() { return id; }
public void setValue(int value) { id = value; }
}

但是,这是不好的做法。enum用于表示constants,如days of weekcolors in rainbow,即这样一组预定义的常量。

@scottf

enum类似于Singleton。JVM创建实例。

如果你自己用类创建它,它可能是这样的

public static class MyEnum {


final public static MyEnum ONE;
final public static MyEnum TWO;


static {
ONE = new MyEnum("1");
TWO = new MyEnum("2");
}


final String enumValue;


private MyEnum(String value){
enumValue = value;
}


@Override
public String toString(){
return enumValue;
}




}

并且可以这样使用:

public class HelloWorld{


public static class MyEnum {


final public static MyEnum ONE;
final public static MyEnum TWO;


static {
ONE = new MyEnum("1");
TWO = new MyEnum("2");
}


final String enumValue;


private MyEnum(String value){
enumValue = value;
}


@Override
public String toString(){
return enumValue;
}




}


public static void main(String []args){


System.out.println(MyEnum.ONE);
System.out.println(MyEnum.TWO);


System.out.println(MyEnum.ONE == MyEnum.ONE);


System.out.println("Hello World");
}
}

我认为你在看c++枚举器的时候会感到困惑。Java枚举器是不同的。

如果你习惯C/ c++枚举,这将是代码:

public class TestEnum {
enum ids {
OPEN,
CLOSE,
OTHER;


public final int value = 100 + ordinal();
};


public static void main(String arg[]) {
System.out.println("OPEN:  " + ids.OPEN.value);
System.out.println("CLOSE: " + ids.CLOSE.value);
System.out.println("OTHER: " + ids.OTHER.value);
}
};