这个java单例类实现有什么问题?

时间:2013-01-18 00:53:47

标签: java

我在stackexchange中遇到过另一篇关于实现java单例的各种方法的文章。显示的方法之一是以下示例。它的投票率非常低。想知道为什么。 What is an efficient way to implement a singleton pattern in 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;
    }

}

3 个答案:

答案 0 :(得分:5)

正如@ Craig在评论中所说:

  

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

基本上它被投了票,因为这是错误的信息,他所说的很多内容显然不是真的。具体来说,在加载类时,使用静态方法初始化静态变量将,而作者声称情况并非如此。

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

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

答案 1 :(得分: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;
    }

}

答案 2 :(得分:0)

这不是实施它的好方法。

由于静态变量是在JVM加载时初始化的,所以只需使单例最终:

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

    private Singleton()
    {
        // build it
    }

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