在 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 的第 21 条有效的Java).
现在在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()
method
- 枚举可以用于
switch()
(编译器甚至会检查您是否忘记了某个值)
但这一切看起来只不过是语法糖,甚至还存在一些限制(例如enum
总是继承自java.lang.Enum
,并且不能被子类化)。
还有其他更根本的好处吗?enum
规定不能用 Typesafe Enum 模式实现吗?
- “不能子类化”不是限制。这是最大的优点之一:它确保始终只有精确的值集定义在
enum
没有更多了!
-
enum
正确处理序列化。你can也可以使用类型安全枚举来做到这一点,但它经常被遗忘(或根本不知道)。这确保了e1.equals(e2)
always暗示e1 == e2
对于任意两个enum
values e1
and e2
(反之亦然,这可能更重要)。
- 有一些特定的轻量级数据结构可以处理枚举:
EnumSet
and EnumMap
(偷自这个答案 https://stackoverflow.com/questions/2077634/enum-in-java-advantages/2079514#2079514)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)