java - Java 的枚举相对于旧的 "Typesafe Enum"模式的优势?

标签 java design-patterns enums language-design

在 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 对于任何两个 enume1e2(反之亦然,这可能更重要)。
  • 有一些特定的轻量级数据结构可以处理枚举:EnumSetEnumMap(从 this answer 窃取)

关于java - Java 的枚举相对于旧的 "Typesafe Enum"模式的优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5092015/

相关文章:

java - 在API响应中返回Enum的值而不是Spring boot中的名称

java - 在camel路由中发送POST请求

c# - 实现两个不同类的相似方法的最佳方法?

c# - 原型(prototype)设计模式

php - Zend Framework 应用程序设计—— session 变量是否应该在模型层访问

枚举中的常量在定义中未见

java - 在java中将一个列表插入另一个列表?

java - 'nameList' 变量是实例变量还是类变量?为什么不包含在 'synchronised(this){}"语句中呢?

java - 运行 jdbc 程序时线程 "main"java.sql.SQLException 中出现异常?

android - Android 上基于枚举的单例的生命周期