Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 枚举常量包含同一枚举类的所有枚举常量_Java_Enums - Fatal编程技术网

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);

我刚刚意识到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
常量,而该常量又包含所有
状态
枚举常量,这不是违反直觉甚至不合逻辑吗

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

.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();