枚举常量包含同一枚举类的所有枚举常量

Nai*_*ree 22 java enums

我刚刚意识到Java中的枚举常量似乎包含了相同类型的所有枚举常量.

例如,以下代码是合法的:

enum State {
    enable, disable, deleted;
}

class Test {
    public static void main(String[] args) {
        for ( State s : State.enable.disable.values() ) {
            System.out.println(s);
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我看到输出结果是:

enable
disable
deleted
Run Code Online (Sandbox Code Playgroud)

enable常量是否包含disable常量而不是反直觉甚至不合逻辑,而常量又包含所有State枚举常数?

这种语言设计背后的可能考虑因素是什么?

JB *_*zet 35

设计人员在第一次设计Java时犯了一个错误:属于类本身的静态成员,而不是类的任何实例,都可以使用类的实例访问.考虑这个课程:

class Foo {
    public static int bar = 0;
}
Run Code Online (Sandbox Code Playgroud)

您通常应该使用bar变量访问

int i = Foo.bar;
Run Code Online (Sandbox Code Playgroud)

但你可以这样做

Foo foo = new Foo();
int i = foo.bar;
Run Code Online (Sandbox Code Playgroud)

这就是这里发生的事情.enable,disable,values(),是类的静态成员State应使用访问State.enable,State.disableState.values().但是enabledisable同样情况之类的State,并且因此也可以用来访问类的静态成员:

State state = State.enable;
State state2 = state.disable;
Run Code Online (Sandbox Code Playgroud)

或者更简单:

State state2 = State.enable.disable;
Run Code Online (Sandbox Code Playgroud)

Uglier,你甚至可以在没有得到NullPointerException的情况下做到这一点:

State state = null;
State[] allStates = state.values();
Run Code Online (Sandbox Code Playgroud)


use*_*751 13

values()是一种静态方法.Java语言允许您在该类的任何实例上调用类的静态方法,但实例将被忽略.

同样的enable,disabledeleted静态字段.

State.enable不包含disable; 相反,State.enable.disable被视为相同State.disable.并且State.enable.disable.values()被视为相同State.disable.values(),其处理方式相同State.values(),当然返回所有三个值的数组.