Java 枚举常量包含同一枚举类的所有枚举常量
我刚刚意识到Java中的枚举常量似乎包含相同类型的所有枚举常量 例如,以下代码是合法的:Java 枚举常量包含同一枚举类的所有枚举常量,java,enums,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);
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
常量,而该常量又包含所有状态
枚举常量,这不是违反直觉甚至不合逻辑吗
这种语言设计背后可能考虑的因素是什么?.values()
是枚举
上的隐式静态方法,无论调用哪个值,都会得到与State.values()
相同的结果
这与您在实例上调用静态方法(而是直接引用类名)几乎相同
实际上,在实例上调用static
方法应该会发出警告,提示您操作不当。values()
是一种静态方法。Java语言允许您在该类的任何实例上调用该类的静态方法,但忽略该实例
对于启用
、禁用
和已删除
,它们都是静态字段
状态。启用
不包含禁用
;相反,State.enable.disable
被视为与State.disable
相同。和State.enable.disable.values()
被视为与State.disable.values()
相同,后者被视为与State.values()
相同,后者当然返回所有三个值的数组。设计师在第一次设计Java时犯了一个错误:属于类本身的静态成员,而不是类的任何实例,可以使用类的实例进行访问。考虑这个类:
class Foo {
public static int bar = 0;
}
您通常应该使用
int i = Foo.bar;
但你也可以这样做
这就是这里发生的事情<代码>启用
,禁用
,值()
,是类状态
的静态成员,应使用状态访问。启用
,状态。禁用
和状态.值()
。但是启用
和禁用
也是类状态
的实例,因此也可用于访问类的静态成员:
State state = State.enable;
State state2 = state.disable;
或更简单:
State state2 = State.enable.disable;
更丑陋的是,您甚至可以在不获取NullPointerException的情况下执行此操作:
State state = null;
State[] allStates = state.values();
只需打开相关警告:“静态字段State.disable应以静态方式访问。”这不是错误,编译器在编译期间将实例变量替换为类名。@Yurets JB并不是指编译器出错,而是指Java的设计者出错。
State state = null;
State[] allStates = state.values();