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



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

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

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

class Foo {
    public static int bar = 0;
}

您通常应该使用

int i = Foo.bar;

但你也可以

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

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

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

或更简单:

State state2 = State.enable.disable;

Uglier,你甚至可以在不获取NullPointerException的情况下做到这一点:

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

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

enabledisabledeleted都是静态字段。

State.enable不包含disable;相反,State.enable.disable被视为与State.disable相同。State.enable.disable.values()的处理方式与State.disable.values()相同,State.values() 的处理方式与 相同,当然,返回一个包含所有三个值的数组。

.values()enum上的隐式static方法,无论您在哪个值上调用它,您都会得到与State.values()相同的结果。

这几乎与您在实例上调用静态方法(而不是直接引用类名(相同。

实际上,在实例上调用static方法应该会引发警告,这表明您操作不当。

最新更新