我在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;
}
}
答案 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;
}
}