tangguo

Java枚举相对于旧的“ Typesafe枚举”模式的优势?

java

在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枚举模式无法实现吗?


阅读 267

收藏
2020-11-16

共1个答案

小编典典

  • “不能被子类化”不是一个限制。这是最大的优点之一:它可以确保始终仅存在,* enum和中定义的所有值!
    enum正确处理序列化。您也可以使用类型安全的枚举来做到这一点,但是它经常被遗忘(或根本不为人所知)。这样可以确保e1.equals(e2)始终暗示e1 == e2着任何两个enume1,e2并且反之亦然,这可能更重要。
  • 有处理枚举的特定轻量级数据结构:EnumSetEnumMap
2020-11-16