2

我在 stackexchange 中看到了另一篇关于实现 java 单例的各种方法的文章。显示的方法之一是以下示例。它的票数很低。想知道为什么。 在 Java 中实现单例模式的有效方法是什么?

public class Singleton {

    private static Singleton instance = null;

    static {
          instance = new Singleton();
          // do some of your instantiation stuff here
    }

    private Singleton() {
          if(instance!=null) {
                  throw new ErrorYouWant("Singleton double-instantiation, should never happen!");
          }
    }

    public static getSingleton() {
          return instance;
    }

}
4

3 回答 3

5

正如@Craig在评论中所说:

不对。加载类时,静态变量与静态块一起初始化。无需拆分声明。

从本质上讲,它被否决了,因为它是错误信息,他所说的很多内容都不是真的。具体来说,在加载类时会使用静态方法初始化静态变量,而作者声称并非如此。

他的论点也没有真正的意义,“数据插入”可以在构造函数中完成。

话虽如此,上面的代码可以正常工作,这只是一种奇怪的方式,并且可以说是最不风格的。

于 2013-01-18T00:58:40.510 回答
1

以下解决方案确保它是线程安全的

public class Singleton {
    // Private constructor prevents instantiation from other classes
    private Singleton() { }

    /**
    * SingletonHolder is loaded on the first execution of Singleton.getInstance() 
    * or the first access to SingletonHolder.INSTANCE, not before.
    */
    private static class SingletonHolder { 
            public static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
            return SingletonHolder.INSTANCE;
    }

}

于 2013-01-18T00:57:42.113 回答
0

这不是实现它的好方法。

由于静态变量是在 JVM 加载时初始化的,因此只需将单例设为 final:

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

    private Singleton()
    {
        // build it
    }

    public static Singleton getInstance()
    {
        return INSTANCE;
    }
}
于 2013-01-18T01:05:20.847 回答