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

标签 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);
         }
    }
}

当我看到输出是:

enable
disable
deleted

enable 常量包含 disable 常量,而后者又包含所有 State 枚举常量,这不是违反直觉甚至不合逻辑吗? ?

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

最佳答案

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

class Foo {
    public static int bar = 0;
}

应该通常使用

访问 bar 变量
int i = Foo.bar;

但你可以也可以

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

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

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

或更简单:

State state2 = State.enable.disable;

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

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

关于java - 一个枚举常量包含同一个枚举类的所有枚举常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30680654/

相关文章:

java - 同步对 SimpleDateFormat 的访问

java - java 8中从父类(super class)继承方法而不是从实现接口(interface)继承默认方法的意义

java - 从唯一实例值创建枚举工厂方法

Swift 枚举错误 : Braced block of statements is an unused closure

java - 使用 GSON 将 JSON 反序列化为枚举

java - 撤消 IDatabaseTester setDataSet()

java - 在集成测试阶段执行 Maven 模块

java - 如何在 Web 应用程序中查找客户端系统 MAC 地址

java - 在 hibernate 中读写通用枚举

c# - Enum.HasFlag 应该返回什么?