如果你有一个Java enum
和一个enum类型的变量,那么:
public enum Something
{
VAL1,
VAL2,
VAL3
}
public Something varName;
为什么有必要写varName = Something.VAL1;
而不是简单地varName = VAL1;
?编译器是否应该从varName
的类型知道它只能将null
,VAL1
,VAL2
和VAL3
作为值?< / p>
答案 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;
}