【发布时间】:2009-09-30 07:39:03
【问题描述】:
我正在用 Java 实现一个单例类,以确保创建的类实例不超过一个。
【问题讨论】:
标签: java class singleton class-design
我正在用 Java 实现一个单例类,以确保创建的类实例不超过一个。
【问题讨论】:
标签: java class singleton class-design
制作单例的最佳方法是什么?使用枚举。
public enum Singleton {
INSTANCE;
public void foo(){ ... }
}
// Usage:
Singleton.INSTANCE.foo();
您可以从 VM 获得大量帮助,不仅可以避免双重实例化,还可以帮助您避免反序列化损坏。
【讨论】:
也许最好的方法是对单个实例使用枚举。这具有可序列化和保证单例以防止序列化和反射的额外好处,这是没有“直接”单例实现的(私有的?我有反射,我嘲笑你的访问修饰符!)。实现起来也很简单:
public enum Singleton {
INSTANCE;
// fields and methods go here
}
【讨论】:
public class Singleton {
public static final Singleton INSTANCE = new Singleton();
private Singleton() { ... }
}
使用静态实例变量优于内部“Holder”类。如果您愿意,您还可以将静态成员设为私有并提供访问它的方法,但所做的只是向堆栈添加另一个方法调用。
【讨论】:
惰性实例化怎么样: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 . . .
}
【讨论】:
默认情况下,单例不是线程安全的。创建单例的常用方法是使用工厂方法来处理一个实例的创建。这样您就可以控制实例的创建。
【讨论】:
如果您关心并发,您将不会使用共享全局状态。
【讨论】: