Enums, What's the use of static methods and implementing interface methods?
我对
另一个困惑是,参见下面的代码片段,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | enum Position { FIRST, SECOND, THIRD; public static void main(String[] args) { //line 1 Position p = Position.SECOND; //line 2 switch(Position.THIRD) { //line 3 case FIRST: //line 4 System.out.println("Congrats, You are the winner");//line 5 break; //line 6 case SECOND : //line 7 System.out.println("Congrats, You are the runner");//line 8 break; //line 9 default : //line 10 System.out.println("Better luck next time"); //line 11 } } } |
如果在
注释这基本上是个打字错误。我的主要问题是,我们在switch条件(编译器允许)中使用语法position.third,但在case中使用相同的语法时,它是不允许的。为什么会这样?
从JLS报价
(One reason for requiring inlining of constants is that switch
statements require constants on each case, and no two such constant
values may be the same. The compiler checks for duplicate constant
values in a switch statement at compile time; the class file format
does not do symbolic linkage of case values.)
这里提到了符号链接。但当我在
What is the use of static methods in Enums?
与其他类型相同。对于枚举,它们通常是"给定这个字符串值,返回等价的枚举"或类似的东西。(在
I see, an Enum can implement an interface. What would be the use?
与任何接口相同-将实现与使用分离。例如,我以前让Enums实现了一个与本地化相关的接口。
My main question was, we are using syntax Position.THIRD in switch condition(which is allowed by compiler) but when we use same syntax in case, it is not allowed. Why is that?
这只是一个语言决定-枚举类型必须与开关值本身的类型相同,所以它是冗余信息。这与您引用的JLS部分无关。
枚举和普通类非常相似,只是它们在实例化上有一定的限制,并且不能扩展类等。
静态方法通常是返回枚举实例的工厂方法,通常查找字段与参数匹配的实例。请参阅此示例。
枚举可以有字段、getter和setter以及其他方法,因此可以实现接口,包括通用接口。请参阅此示例。
当需要有限集(如果命名实例)时,可以使用枚举而不是类。
Enums可以制作非常漂亮的单体…这基本上回答了你所有的问题。)