【问题标题】:An enum constant contains all the enum constants of the same enum class一个枚举常量包含同一个枚举类的所有枚举常量
【发布时间】:2015-08-21 05:42:23
【问题描述】:

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

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

【问题讨论】:

标签: java enums


【解决方案1】:

设计者在第一次设计 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 类的实例,因此也可以用于访问类的静态成员:

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

或更简单:

State state2 = State.enable.disable;

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

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

【讨论】:

  • 这不是错误,编译器在编译时将实例变量替换为类名。
  • @Yurets JB 并不是说​​编译器犯了错误,而是 Java 的设计者犯了错误。
【解决方案2】:

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

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

State.enable 不包含disable;相反,State.enable.disable 被视为与State.disable 相同。并且State.enable.disable.values() 被视为与State.disable.values() 相同,State.values()State.values() 相同,后者当然会返回一个包含所有三个值的数组。

【讨论】:

    【解决方案3】:

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

    在实例上调用静态方法几乎是一样的(而不是直接引用类名)。

    实际上,在实例上调用 static 方法应该会引发警告,暗示您的操作不正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      相关资源
      最近更新 更多