我使用枚举来制作一些常量:
enum ids {OPEN, CLOSE};
OPEN值为零,但我希望它为100.是否可能?
答案 0 :(得分:291)
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。
答案 1 :(得分:87)
是。您可以将数值传递给枚举的构造函数,如下所示:
enum Ids {
OPEN(100),
CLOSE(200);
private int value;
private Ids(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
有关详细信息,请参阅Sun Java Language Guide。
答案 2 :(得分:12)
关于使用这种方式的内容:
public enum HL_COLORS{
YELLOW,
ORANGE;
public int getColorValue() {
switch (this) {
case YELLOW:
return 0xffffff00;
case ORANGE:
return 0xffffa500;
default://YELLOW
return 0xffffff00;
}
}
}
只有一种方法..
您可以使用静态方法并将Enum作为参数传递 像:
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;
}
}
请注意,这两种方式使用更少的内存和更多的处理单元。我不是说这是最好的方法,而只是另一种方法。
答案 3 :(得分:10)
如果您使用非常大的枚举类型,则以下内容非常有用;
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;
}
}
答案 4 :(得分:4)
如果你想要模拟C / C ++的枚举(基数和nexts增量):
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
答案 5 :(得分:1)
ordinal()函数返回标识符在枚举中的相对位置。您可以使用它来获取带有偏移量的自动索引,就像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);
}
};
给出输出:
OPEN: 100
CLOSE: 101
OTHER: 102
编辑:刚刚意识到这与ggrandes' answer非常相似,但是我将其保留在这里,因为它非常干净,并且与C风格枚举几乎一样。
答案 6 :(得分:1)
@scottf
枚举就像一个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");
}
}
答案 7 :(得分:0)
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
构造函数。什么!!是的,它在OPEN
和close
上被调用。 100
的{{1}}和OPEN
的{{1}}用什么值
我可以使用其他值吗?
是的
200
但是,这是不好的做法。 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
,即这样的一小组预定义常量。
答案 8 :(得分:0)
我认为您对查看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);
}
};