最好将Singleton的实例声明为static
或static final
?
请参阅以下示例:
static
版本
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
static final
版本
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
}
答案 0 :(得分:2)
在您的特定情况下,完全没有区别。而你的第二个已经是effectively final。
但是
不考虑以下实现不是线程安全的事实,只是显示与final的区别。
如果您的实例延迟初始化,您可能会感觉不同。看起来很懒惰的初始化。
public class Singleton {
private static Singleton INSTANCE; /error
private Singleton() {
}
public static Singleton getInstance() {
if (INSTANCE ==null) {
INSTANCE = new Singleton(); //error
}
return INSTANCE;
}
}
答案 1 :(得分:0)
如果您不想懒惰(并进行延迟初始化),那么您可能希望将其设为final
,因为您可以(故意)执行以下操作:
class Sample {
static Object o = new Object(); // o is not final. Hence can change.
static{
o = new Object();
o = new Object();
}
}
我建议使用Singleton
代替此Enum
。
答案 2 :(得分:-2)
人们仅使用static
来解释延迟初始化。
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null)
instance = new Singleton();
return instance;
}
}
这样,即使您的应用程序根本不使用它,也不需要始终持有实例。 仅在应用程序第一次需要时才创建它。