Java 单件模式:静态还是静态最终?
最好将单例实例声明为Java 单件模式:静态还是静态最终?,java,design-patterns,static,singleton,final,Java,Design Patterns,Static,Singleton,Final,最好将单例实例声明为static或static final 请参见以下示例: 静态版本 public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance() { return instance; } } public cla
static
或static final
请参见以下示例:
静态
版本
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
}
静态最终版
版本
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
}
人们只使用
静态
来解释延迟初始化
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null)
instance = new Singleton();
return instance;
}
}
这样,即使应用程序根本不使用实例,也不需要始终保存实例。
只在应用程序第一次需要时创建它。在您的特定情况下,没有任何区别。你的第二个已经是了 但是 撇开下面的实现不是线程安全的这一事实不谈,只是显示了与final的区别 在延迟初始化实例的情况下,您可能会感觉到不同。看起来很懒
public class Singleton {
private static Singleton INSTANCE; /error
private Singleton() {
}
public static Singleton getInstance() {
if (INSTANCE ==null) {
INSTANCE = new Singleton(); //error
}
return INSTANCE;
}
}
如果您不想偷懒(并进行偷懒初始化),那么您可能希望将其设置为final,因为您可以(有意地)这样做:
class Sample {
static Object o = new Object(); // o is not final. Hence can change.
static{
o = new Object();
o = new Object();
}
}
我建议使用
Singleton
而不是使用Enum
。@alex2410这只是为了在最终版本中有所不同。这不是线程安全的问题。@alex2410同样,这不是一个解决方案。我在第一行中给出了区别。在已经实施的解决方案中,没有任何可用性。这只是为了显示static final
和static
之间的差异。了解实现。线程安全还取决于对象的其他字段。OP的问题是关于是否是最终的……我不明白这个解决方案:为什么是这段代码?@user-这一条解释了为什么在OP的当前代码中使用final