我在Java中实现一个单例类,以确保只创建了一个类的实例。
答案 0 :(得分:11)
制作单身人士的最佳方式?使用枚举。
public enum Singleton {
INSTANCE;
public void foo(){ ... }
}
// Usage:
Singleton.INSTANCE.foo();
您可以从VM获得大量帮助,不仅可以避免双重实例化,还可以帮助您避免反序列化损坏。
答案 1 :(得分:6)
也许最好的方法是使用带有单个实例的枚举。这样做的另一个好处是可序列化并保证对序列化和反射的单一性,这没有“直截了当”的Singleton实现(私有?我有反思,我嘲笑你的访问修饰符!)。它的实现也非常简单:
public enum Singleton {
INSTANCE;
// fields and methods go here
}
答案 2 :(得分:2)
public class Singleton {
public static final Singleton INSTANCE = new Singleton();
private Singleton() { ... }
}
使用静态实例变量比内部“Holder”类更受欢迎。如果您愿意,您也可以将静态成员设为私有,并提供访问它的方法,但所有这一切都是向堆栈添加另一个方法调用。
答案 3 :(得分:1)
lazy instanciation:getInstance()返回单例,如果是第一次调用则创建它。
public class MySingleton
{
private static MySingleton instance;
private MySingleton()
{
// construct object . . .
}
// For lazy initialization
public static synchronized MySingleton getInstance()
{
if (instance==null)
{
instance = new MySingleton();
}
return instance;
}
// Remainder of class definition . . .
}
答案 4 :(得分:0)
单身人士默认情况下不是线程安全的。创建单例的常用方法是使用一个工厂方法来处理一个实例的创建。这样你就可以控制实例的创建。
答案 5 :(得分:0)
如果您关心并发,则不会使用共享全局状态。