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

2022-09-02 00:29:07

我刚刚意识到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

常量包含常量,而常量又包含所有枚举常量,这难道不是违反直觉甚至不合逻辑的吗?enabledisableState

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


答案 1

设计人员在第一次设计 Java 时犯了一个错误:静态成员(属于类本身,而不是类的任何实例)可以使用类的实例进行访问。请考虑以下类:

class Foo {
    public static int bar = 0;
}

您通常应该使用以下命令访问柱线变量

int i = Foo.bar;

但你也可以

Foo foo = new Foo();
int i = foo.bar;

这就是这里正在发生的事情。、 、 、 是应使用 和 访问的类的静态成员。但是 和 也是类的实例,因此也可以用来访问类的静态成员:enabledisablevalues()StateState.enableState.disableState.values()enabledisableState

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

或更简单:

State state2 = State.enable.disable;

更丑陋,你甚至可以在不获得NullPointerException的情况下做到这一点:

State state = null;
State[] allStates = state.values();

答案 2

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

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

State.enable不包含 ;相反,与 对待相同。并且与 处理方式相同,后者与 相同,当然返回所有三个值的数组。disableState.enable.disableState.disableState.enable.disable.values()State.disable.values()State.values()