我不时遇到一些Java程序员,他们不确定他们应该如何正确实现Singleton模式。
(如果您不知道什么是Singleton,请尝试Wikipedia: Singleton模式 )。
我并不是在谈论在线程环境中的正确实现。 但是,使用最常见的实现,您可以在Internet上找到所需的内容,从而可以轻松创建任意多个单例。
试想一下,您有以下常见的单例实现:
public final class NonSafeSingleton implements Serializable {
private static final NonSafeSingleton INSTANCE = new NonSafeSingleton();
private NonSafeSingleton() {}
public static NonSafeSingleton getInstance() {
return INSTANCE;
}
}
现在专注于可序列化单词。 再想一秒钟…是的,您是对的。 如果您通过RMI发送这些东西,您将获得第二实例。 甚至需要执行一些内存序列化,反序列化和kaboom操作! 您刚刚取消了一般的Singleton合同。 那不太好。 但是如何解决呢? 通常,我使用两种方法:
- 困难的方式(或者您使用1.4或更旧的Java)
您需要在Singleton类中实现readResolve方法。 这个小东西用来覆盖已创建的序列化机制。 您返回的内容将用于代替序列化产生的数据(有关详细信息,请参见: Serializable Javadoc )。 只需在此处返回您的实例:... protected Object readResolve() throws ObjectStreamException { return INSTANCE; } ...
- 简单方法(是的,我使用的是1.5或更高版本)
将您的单例类更改为枚举,并删除私有构造函数和getInstance方法。 是的,就是这么简单。 然后,您可以免费获得它。public enum SafeSingleton implements Serializable { INSTANCE; }
在实施下一个Singleton时,请记住这一点。 如果大量使用RMI,可以使您的生活更轻松。
参考:来自我们的JCG合作伙伴 Marek Piechut的《完美单身汉》,在《 发展世界》中 。
相关文章 :
翻译自: https://www.javacodegeeks.com/2011/08/perfect-singleton.html