【问题标题】:The best singleton pattern since Java 5自 Java 5 以来最好的单例模式
【发布时间】:2011-04-22 20:09:43
【问题描述】:

从 Java 5 开始,据说创建单例的最佳方法是使用单元素枚举类型。

例子:

public enum SuperSingleton implements Zooma{
    INSTANCE;

    /**
     */
    public void fightTheBattle(){
        System.out.println("I am fighting the battle!!!");
    }

    @Override
    public void runningWild() {
        //This is method implemented from the Zooma interface.      
    }
}

根据 Joshua Bloch 的说法,单元素枚举类型单例是;

  • 更简洁
  • 免费提供序列化机制
  • 并提供了针对多重实例化的铁证。

我可以看到它是如何更简洁的,以及它如何提供针对多重实例化的铁证, 但它如何免费提供序列化机制?

这是单例通过枚举获得的东西吗?

【问题讨论】:

标签: java enums singleton java-5


【解决方案1】:

是的,枚举都是从Enum class 扩展而来的,它实现了Serializable

【讨论】:

  • 哇,这听起来很冒险,意思是,如果单例有某种状态并且它在瞬间被持久化两次,那么这些对象的反序列化可能是不可预测的,并且单例可能会以意想不到的方式表现.
  • @Augusto:枚举通常不应该有状态。如果你让它们有状态,你就会以各种方式自找麻烦。
  • 但是你说的是序列化逻辑中的错误,而不是对序列化本身的支持。根据定义,单例只能实例化一次,这意味着适当的序列化策略只会将其持久化一次或覆盖多个持久化。
  • @ColinD 100% 同意,但是一些单身人士需要保持状态......我想我想说的是 ENUM 解决方案可能不是 最好的,但是在某些情况下是一个很好的解决方案。
  • @Augusto:对有状态对象或您可能不想在测试中使用的对象使用静态实例单例模式通常是一个坏主意,无论您是否使用枚举。单例有很多简单的无状态用途,但枚举单例很好。
【解决方案2】:

我不是 100% 确定,但我认为如果你反序列化一个序列化的单例,那么你可能会得到多个实例。枚举实例将始终保持为单例。

因此,与仅实现序列化相比,您将获得“更多的序列化”。

【讨论】:

    【解决方案3】:
    猜你喜欢
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    相关资源
    最近更新 更多