我刚刚意识到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.disable和State.values().但是enable和disable同样情况之类的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,disable和deleted静态字段.
State.enable不包含disable; 相反,State.enable.disable被视为相同State.disable.并且State.enable.disable.values()被视为相同State.disable.values(),其处理方式相同State.values(),当然返回所有三个值的数组.
| 归档时间: |
|
| 查看次数: |
1173 次 |
| 最近记录: |