首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >交替实现Singleton

交替实现Singleton
EN

Stack Overflow用户
提问于 2013-08-13 04:51:52
回答 4查看 146关注 0票数 7

实现单例设计模式的标准方法如下:

代码语言:javascript
复制
public class Singleton {
    private static Singleton instance = new Singleton();

    public static Singleton getInstance() {
        return instance;
    }

    private Singleton() {}
}

我想知道您是否也可以这样实现它:

代码语言:javascript
复制
public class Singleton {
    private Singleton() {}
    public final static Singleton INSTANCE = new Singleton();
}

如果是的话,哪个版本更好?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-13 04:58:00

都不是。在这两种情况下,受信任的使用者都可以通过反射调用私有构造函数。另一个问题是,除非采取额外的步骤,否则这些实现不能很好地处理序列化(默认情况下,如果采用天真的方法,每次反序列化Singleton时,它都会创建一个新实例)。

正确的解决方案是使用定义单个值的enum

代码语言:javascript
复制
public enum Singleton {
    INSTANCE;

    // methods
}

来自有效的Java:

虽然这种方法尚未被广泛采用,但单元素枚举类型是实现单例的最佳方法。

票数 10
EN

Stack Overflow用户

发布于 2013-08-13 04:59:40

你为什么不使用枚举来实现Singleton?

代码语言:javascript
复制
 public enum SingletonEnum {
     Instance;
     private static String testStr = "";

     public static void setTestStr(String newTestStr) {
         testStr = newTestStr;
     }

     public static String getTestStr() {
         return testStr;
     }

     public static String sayHello(String name) {
         return "Hello " + name;
     }
 }
票数 1
EN

Stack Overflow用户

发布于 2013-08-13 04:56:27

在我看来,第一个更好,因为它看起来更符合面向对象的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18200923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档