Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自Java5以来最好的单例模式_Java_Enums_Singleton_Java 5 - Fatal编程技术网

自Java5以来最好的单例模式

自Java5以来最好的单例模式,java,enums,singleton,java-5,Java,Enums,Singleton,Java 5,自从Java5以来,据说创建单例的最佳方法是使用单元素枚举类型 例如: public enum SuperSingleton implements Zooma{ INSTANCE; /** */ public void fightTheBattle(){ System.out.println("I am fighting the battle!!!"); } @Override public void runningW

自从Java5以来,据说创建单例的最佳方法是使用单元素枚举类型

例如:

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的说法,单元素枚举类型singleton是

  • 更简洁
  • 免费提供序列化机制
  • 并提供了一个针对多个实例化的铁壳
我可以看到它是如何更加简洁,以及它是如何提供一个针对多个实例化的铁壳, 但它是如何免费提供序列化机制的?


是的,枚举都是从中扩展出来的,它实现了可序列化的


是:)

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


因此,你得到的是“更多的序列化”,而不是仅仅实现序列化所得到的。

+1尽管我认为单例是由“敌人”布什先生创造的,我引用他的话。答案在中。请看这个问题,好的,这是很明显的。谢谢你们。我喜欢Enum——但你们的单身汉将不能再继承了@请看,这听起来很危险,也就是说,如果单例具有某种状态,并且在某个时刻持续了两次,那么这些对象的反序列化可能是不可预测的,并且单例可能以意外的方式运行。@Augusto:enum通常不应具有状态。如果将它们设置为有状态,您会以各种方式自找麻烦,但您所说的是序列化逻辑中的错误,而不是对序列化本身的支持。根据定义,单例只能实例化一次,这意味着适当的序列化策略只能将其持久化一次或在多次持久化时覆盖。@ColinD 100%同意,但某些单例需要维护状态。。。我想我想说的是,枚举解决方案可能不是最好的,但在某些情况下是一个很好的解决方案。@Augusto:对有状态对象或您可能不想在测试中使用的对象使用静态实例单例模式通常是一个坏主意,不管您是否使用枚举。单例有很多简单的、无状态的用法,其中enum单例很好。