我刚刚意识到 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;
}
您通常应该使用
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
的实例,因此也可以用来访问类的静态成员:
State state = State.enable;
State state2 = state.disable;
或更简单:
State state2 = State.enable.disable;
Uglier,你甚至可以在不获取NullPointerException的情况下做到这一点:
State state = null;
State[] allStates = state.values();
values()
是一个静态方法。Java 语言允许您在类的任何实例上调用该类的静态方法,但该实例将被忽略。
enable
、disable
和deleted
都是静态字段。
State.enable
不包含disable
;相反,State.enable.disable
被视为与State.disable
相同。State.enable.disable.values()
的处理方式与State.disable.values()
相同,State.values()
的处理方式与 相同,当然,返回一个包含所有三个值的数组。
.values()
是enum
上的隐式static
方法,无论您在哪个值上调用它,您都会得到与State.values()
相同的结果。
这几乎与您在实例上调用静态方法(而不是直接引用类名(相同。
实际上,在实例上调用static
方法应该会引发警告,这表明您操作不当。