我刚刚意识到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);
}
}
}
当我看到输出是:
enable
disable
deleted
enable
常量包含 disable
常量,而后者又包含所有 State
枚举常量,这不是违反直觉甚至不合逻辑吗? ?
这种语言设计背后可能的考虑是什么?
最佳答案
设计者在最初设计 Java 时犯了一个错误:静态成员属于类本身,而不属于类的任何实例,可以使用类的实例来访问。考虑这个类:
class Foo {
public static int bar = 0;
}
您应该通常使用
访问 bar 变量int i = Foo.bar;
但你可以也可以
Foo foo = new Foo();
int i = foo.bar;
这就是这里发生的事情。 enable
、disable
、values()
是 State
类的静态成员,应该使用 进行访问>State.enable
、State.disable
和 State.values()
。但是enable
和disable
也是State
类的instances,因此也可以用来访问静态成员类(class):
State state = State.enable;
State state2 = state.disable;
或更简单:
State state2 = State.enable.disable;
更丑,你甚至可以在没有得到 NullPointerException 的情况下这样做:
State state = null;
State[] allStates = state.values();
关于java - 一个枚举常量包含同一个枚举类的所有枚举常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30680654/