在 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 模式实现?
最佳答案
- “不能被子类化”不是限制。这是最大的优势之一:它确保始终只有
enum
中定义的一组值,没有更多! enum
正确处理序列化。您可以使用类型安全的枚举来做到这一点,但它经常被遗忘(或根本不知道)。这确保e1.equals(e2)
always 暗示e1 == e2
对于任何两个enum
值e1
和e2
(反之亦然,这可能更重要)。- 有一些特定的轻量级数据结构可以处理枚举:
EnumSet
和EnumMap
(从 this answer 窃取)
关于java - Java 的枚举相对于旧的 "Typesafe Enum"模式的优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5092015/