枚举常量包含同一枚举类的所有枚举常量

时间:2015-06-06 08:27:06

标签: java enums

我刚刚意识到Java中的枚举常量似乎包含了所有相同类型的枚举常量。

例如,以下代码是合法的:

enable
disable
deleted

当我看到输出结果为:

时,我感到非常惊讶
enable

disable常量是否包含State常量,反过来又保留所有name枚举常量,这是违反直觉还是不合逻辑的?

这种语言设计背后的可能考虑因素是什么?

3 个答案:

答案 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; enabledisablevalues()类的静态成员,应使用StateState.enable和{{1}进行访问}。但State.disableState.values()也是类enable实例,因此也可用于访问类的静态成员:

disable

或更简单:

State

Uglier,你甚至可以在没有得到NullPointerException的情况下这样做:

State state = State.enable;
State state2 = state.disable;

答案 1 :(得分:13)

values()静态方法。 Java语言允许您在该类的任何实例上调用类的静态方法,但实例将被忽略。

enabledisabledeleted相同,它们是静态字段。

State.enable不包含disable;相反,State.enable.disableState.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方法时,应该发出一个警告,提示你做错了。

相关问题