在走单身路线之前,请重新考虑。您真的需要单身人士吗?如果您需要实现单例的方案,那是因为对它们的需求并没有真正表达出来。您最好不要仅在代码库中引入单例,因为遵循设计模式会很酷。
干净的代码讨论-全局状态和单例
一次还不够
表演者单身人士
但是,真正值得了解的是Dependency
Injection。
现在,如果您真的想用Java实现单例,那么我将推荐Joshua
Bloch的“有效Java”实现方法:
public class Singleton{ public static Singleton getInstance() { return SingletonHolder.instance; } private Singleton() {} private static final class SingletonHolder { static final Singleton instance = new Singleton(); }}在JLS保证JVM不会初始化实例,直到有人呼叫
getInstance();
最后要注意的是,在Java直至Java
5中,Double
Checked锁定模式均已中断。Java
5内存模型使DCL模式线程安全,但是
SingletonHolder在最初的意图是性能优化的同时,它使其速度比类方法慢。
编辑:正如@Luno指出的那样,自从本书第二版以来,首选方法是:
从1.5版开始,存在第三种实现单例的方法。只需使用一个元素创建一个枚举类型:
// Enum singleton - the preferred approachpublic enum Elvis { INSTANCE; public void leaveTheBuilding() { ... }}此方法在功能上与公共领域方法等效,除了它更简洁,免费提供序列化机制,甚至针对复杂的序列化或反射攻击,还提供了针对多重实例化的明确保证。尽管此方法尚未得到广泛采用,
但是单元素枚举类型是实现单例的最佳方法。



