在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模式。
Typesafe Enum
我知道的其他差异:
枚举自动提供一种values()方法 可以使用枚举switch()(并且编译器甚至检查您是否忘记了一个值) 但这一切看起来都只不过是语法糖,甚至还有一些限制(例如,enum总是继承自java.lang.Enum,并且不能被子类化)。
还有其他更基本的好处可以enum提供,而Typesafe枚举模式无法实现吗?
enum
e1.equals(e2)
e2
e1,e2
EnumSet
EnumMap