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

enum ids {OPEN, CLOSE};

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


当前回答

我认为你在看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);
}
};

其他回答

 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中定义的构造函数。

我来解释一下。

当类装入器装入枚举类时,则枚举构造函数也被调用。什么! !是的,它叫做OPEN and close。OPEN为100,close为200

我能有不同的价值吗?

Yes,

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

但是,这是不好的做法。枚举用于表示常量,如星期几,彩虹中的颜色,即这样一组预定义的常量。

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

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

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。

函数的作用是:返回标识符在枚举中的相对位置。您可以使用它来获得带有偏移量的自动索引,就像使用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的答案非常相似,但我将把它留在这里,因为它非常干净,并且与C风格的enum非常接近。

我认为你在看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);
}
};