我刚刚意识到Java中的枚举常量似乎包含了所有相同类型的枚举常量。
例如,以下代码是合法的:
enable
disable
deleted
当我看到输出结果为:
时,我感到非常惊讶enable
disable
常量是否包含State
常量,反过来又保留所有name
枚举常量,这是违反直觉还是不合逻辑的?
这种语言设计背后的可能考虑因素是什么?
答案 0 :(得分:35)
设计师在他们第一次设计Java时犯了一个错误:属于类本身的静态成员,而不是类的任何实例,可以使用类的实例访问。考虑这个课程:
function your_controler() {
$this->load->model('model_file');
$site = $this->model_file->getsetting();
if(isset($site) && $site==1){// your condition here
$this->load->view('index', $data);
}else{
$this->load->view('maintenance', $data)
}
}
你应该通常使用
访问bar变量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
和{{1}进行访问}。但State.disable
和State.values()
也是类enable
的实例,因此也可用于访问类的静态成员:
disable
或更简单:
State
Uglier,你甚至可以在没有得到NullPointerException的情况下这样做:
State state = State.enable;
State state2 = state.disable;
答案 1 :(得分:13)
values()
是静态方法。 Java语言允许您在该类的任何实例上调用类的静态方法,但实例将被忽略。
enable
,disable
和deleted
相同,它们是静态字段。
State.enable
不包含disable
;相反,State.enable.disable
与State.disable
的处理方式相同。 State.enable.disable.values()
与State.disable.values()
的处理方式相同,State.values()
与$setting = $this->modelName->getsetting();
if($setting['maintenance'] == 1){
$this->load->view('maintenance', $data);
} else {
$this->load->view('index' $data);
}
的处理方式相同,当然会返回所有三个值的数组。
答案 2 :(得分:4)
.values()
是static
上隐含的 enum
方法,无论您调用它的是哪个值,您都会得到相同的结果为State.values()
。
您在实例上调用静态方法(而不是直接引用类名)几乎相同。
实际上,在实例上调用static
方法时,应该发出一个警告,提示你做错了。