为什么Java需要EnumClass.VALUE而不仅仅是VALUE?

时间:2015-08-19 22:43:14

标签: java enums

如果你有一个Java enum和一个enum类型的变量,那么:

public enum Something
{
   VAL1,
   VAL2,
   VAL3
}

public Something varName;

为什么有必要写varName = Something.VAL1;而不是简单地varName = VAL1;?编译器是否应该从varName的类型知道它只能将nullVAL1VAL2VAL3作为值?< / p>

4 个答案:

答案 0 :(得分:5)

=语句的右侧是一个表达式,通常会被解析。无论如何,为了说明编译器的复杂程度,请考虑以下几点:

public enum Something { VAL1, VAL2, VAL3 }

Something VAL3 = Something.VAL1;

Something a = VAL3;

a分配VAL1还是VAL3

您不需要枚举名称的唯一时间是switch语句,因为case语句必须使用有效的枚举值,因此枚举名称是不必要的。

switch (a) {
    case VAL1:
        // do something
        break;
    case VAL2:
        // do something
        break;
    case VAL3:
        // do something
        break;
}

答案 1 :(得分:4)

这是一个很好的问题。另外,我能想到的唯一原因是这样的事情是完全有效的(如果你讨厌那些阅读你代码的人):

public class Evil {
     public enum FooBar { FOO, BAR }
     public static FooBar FOO = FooBar.BAR;

     private FooBar baz = FOO;    // means Evil.FOO, i.e. FooBar.BAR
}

Java确实有一些类型推断(例如,final List<String> emptyStringList = java.util.Collections.emptyList()等同于final List<String> emptyStringList = java.util.Collections.<String>emptyList(),并且自Java 5开始),但这种类型推断从不改变表达式的含义,它只是为一个不明确的表达式选择一个含义。

答案 2 :(得分:1)

如果您有两个定义VAL1的枚举,编译器如何知道您指的是哪一个?

然而,静态导入可能会使事情更具可读性:

import static Something.VAL1;

答案 3 :(得分:0)

它始终没有。如果所有范围内枚举的所有范围都是自动打开的话,它大部分时间都会解决会出现的歧义,但有一种情况是它确实打开了一个枚举的范围:switch语句:

Enum MyEnum
{
    Value1;
}
MyEnum value = ...;
switch (myEnumValue)
{
case Value1:
    //
    break;
}