【问题标题】:advantage of enum over class in singleton pattern单例模式中枚举优于类的优势
【发布时间】:2014-09-11 06:41:14
【问题描述】:

我最近才知道enum 是一种更有效的实现单例的方法。

单例enum:

public enum Singleton{
INSTANCE;
    public void doStuff(){
        //......
    }
    public void doMoreStuff(){
        //......
    }
}

单例class:

public class Singleton{
    private static final INSTANCE = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return INSTANCE;
    }

    public void doStuff(){
        //......
    }
    public void doMoreStuff(){
        //......
    }
}

问题:使用枚举而不是类来实现单例有哪些可能的优点或缺点?

【问题讨论】:

标签: java class enums singleton


【解决方案1】:

作为explained by Joshua Bloch,如果您的单例不可序列化,这两种方法在功能上是相同的。尽管您可能希望将代码添加到您的私有 Singleton 构造函数,以防止反射被用于创建第二个实例。

如果你的单例是可序列化的,那么枚举方法将免费提供所有必要的管道,而使用静态字段方法,你必须自己添加。

在我看来,采用枚举方法没有缺点。

【讨论】:

    【解决方案2】:

    我相信枚举是创建单例的最佳方式。如果您正在寻找缺点

    1. 不能使用枚举进行延迟加载
    2. 如果对枚举进行序列化和反序列化,枚举中的成员将重置为默认值。
    3. 如果您改变主意并希望使其成为非单例,使用双重检查同步单例很容易。

    【讨论】: