【发布时间】:2011-07-02 19:08:04
【问题描述】:
在 JDK1.5 之前的 Java 中,“Typesafe Enum”模式是实现只能采用有限数量值的类型的常用方法:
public class Suit {
private final String name;
public static final Suit CLUBS =new Suit("clubs");
public static final Suit DIAMONDS =new Suit("diamonds");
public static final Suit HEARTS =new Suit("hearts");
public static final Suit SPADES =new Suit("spades");
private Suit(String name){
this.name =name;
}
public String toString(){
return name;
}
}
(参见例如 Bloch 的 Effective Java 中的第 21 项)。
现在在JDK1.5+中,“官方”的方式显然是使用enum:
public enum Suit {
CLUBS("clubs"), DIAMONDS("diamonds"), HEARTS("hearts"), SPADES("spades");
private final String name;
private Suit(String name) {
this.name = name;
}
}
显然,语法更好更简洁(无需显式定义值的字段,提供合适的toString()),但到目前为止enum 看起来非常像Typesafe Enum 模式。
我知道的其他差异:
- 枚举自动提供
values()方法 - 枚举可用于
switch()(编译器甚至会检查您是否忘记了某个值)
但这一切看起来只不过是语法糖,甚至还有一些限制(例如,enum 总是继承自 java.lang.Enum,并且不能被子类化)。
enum 提供的其他更基本的好处是否无法通过 Typesafe Enum 模式实现?
【问题讨论】:
-
真正的优势:序列化速度更快。其余的可以模拟。
-
@sleske 编译器在 switch 中检查是什么意思。我没听说过这个功能。最好不要使用 switch 而是为抽象方法的每个枚举值实现一个具体的方法。
-
@user1198898:如果您在开关中重复
case,编译器将显示错误,并且如果不是所有枚举值都被案例覆盖,它会发出警告。是的,通常使用多态性而不是开关会更好,但这取决于具体情况。 -
@sleske 感谢您清除它。
标签: java design-patterns enums language-design