当前位置: 首页 > 面试题库 >

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

谷泳
2023-03-14
问题内容

在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正确处理序列化。您也可以使用类型安全的枚举来做到这一点,但是它经常被遗忘(或根本不为人所知)。这样可以确保e1.equals(e2)始终暗示e1 == e2着任何两个enume1,e2并且反之亦然,这可能更重要。
  • 有处理枚举的特定轻量级数据结构EnumSetEnumMap


 类似资料:
  • 在Java中,有没有办法从现有枚举中定义一个新枚举?我想要以下功能。 1、2、3和所有这些都必须相同,即, 一个真实的例子是天、星期、周末、讲座、派对等。

  • 问题内容: 这不是卡住我的问题,而是我正在寻找一种编写代码的整洁方法。 本质上,我正在编写一个事件驱动的应用程序。用户触发一个事件,该事件被发送到适当的对象,然后这些对象处理事件。现在,我正在编写偶数处理程序方法,并且希望使用switch语句确定如何处理事件。现在,在我研究通用结构时,事件类非常简单: 然后,在另一堂课中,我会看到类似以下内容的内容: 我会 喜欢 做的就是这样的事情(尽管我当然会坚

  • 我听到一些人建议在C++中使用枚举类,因为它们的类型安全。 但这到底意味着什么呢?

  • 问题内容: 使Java中的枚举类似于类而不是像C / C ++那样仅是常量集合有哪些优点? 问题答案: 您可以获得有效值的免费编译时检查。使用 不保证 只会接受0或1作为参数值。使用枚举是可以保证的。此外,由于您可以使用代码完成功能来查看所有枚举值,因此这会导致更多的自我记录代码。

  • 让我们看看一个需要诉诸于代码的场景,来考虑为何此时使用枚举更为合适且实用。假设我们要处理 IP 地址。目前被广泛使用的两个主要 IP 标准:IPv4(version four)和 IPv6(version six)。这是我们的程序可能会遇到的所有可能的 IP 地址类型:所以可以 枚举 出所有可能的值,这也正是此枚举名字的由来。 任何一个 IP 地址要么是 IPv4 的要么是 IPv6 的,而且不能

  • 问题内容: 我想声明一个枚举Direction,它具有一个返回相反方向的方法(以下语法不正确,即,不能实例化枚举,但它说明了我的观点)。这在Java中可行吗? 这是代码: 问题答案: 对于那些按标题吸引的人:是的,您可以在枚举中定义自己的方法。如果您想知道如何调用这种非静态方法,则可以使用与其他任何非静态方法相同的方法- 在定义或继承该方法的类型实例上调用它。如果是枚举,则此类实例仅为s。 因此,