与Enum类型混淆

Mic*_*ael 1 java

为什么当我定义枚举时,我传递一个字段名称列表,然后以某种方式那些字段名称(例如Days.MONDAY)最终引用字段?我可以传递一个字段(例如Days.MONDAY),然后使用开关来获取字段值.更奇怪的是,当我声明枚举字段时,我甚至不必将名称放在引号中,即使它们实际上是值.

Ste*_*e J 5

Java中的枚举与其他语言中的枚举不同.他们需要一些使用.从本质上讲,枚举是一个特殊的类,你声明的每个枚举都是该类的一个对象:

public enum Day {

    MONDAY, TUESDAY, WEDNESDAY

}
Run Code Online (Sandbox Code Playgroud)

星期一,星期二和星期天是星期日的对象,使用普通类可以获得几乎相同的效果,但枚举语法明确指出了你的意图.此外,您无法在其他地方创建THURSDAY - 仅在枚举括号内.这意味着编译器始终知道枚举值的完整列表,并允许Java在switch语句等地方使用枚举,因为编译器具有创建跳转表和检查代码正确性所需的所有信息. .

所以MONDAY 不是某个整数值的标签,比如其他语言的枚举.它是一个像任何其他Java对象一样的对象.这就是为什么你不把它们放在引号中.这就像写作:

final static Day MONDAY = new Day();
final static Day TUESDAY = new Day();
Run Code Online (Sandbox Code Playgroud)

等等.你甚至可以做这样的技巧:

public enum Day {

    MONDAY("Mon", false), TUESDAY("Tue", false), WEDNESDAY("Wed", true);

    private String shortForm = null;
    private boolean humpDay = false;

    Day(String shortForm, boolean humpDay) {
        this.shortForm = shortForm;
        this.humpDay=humpDay;
    }

    public String getShortForm() {
        return shortForm;
    }

    public boolean isHumpDay() {
        return humpDay;
    }

}
Run Code Online (Sandbox Code Playgroud)

MONDAY,TUESDAY,WEDNESDAY中的每一个都是Day的对象,每个都有自己的成员,包括shortForm和humpDay.甚至还有一个构造函数.看到?对象,而不是值.

需要TUESDAY的简短表格吗?只需要做TUESDAY.getShortForm().在其他语言中,您不能使用重新标记的整数常量范例.

我希望有所帮助.Java枚举非常强大,但对于习惯于使用其他语言的枚举的人来说,直到他们有了突破性的时刻("我现在看到它们!它们就像对象声明!")可能会令人困惑.