单身数字
我不时遇到一些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在《 发展世界 》上的完美单身女性。
相关文章 :
- Java中可怕的双重检查锁定习惯用法
- Java Secret:使用枚举构建状态机
- 依赖注入–手动方式
- Java泛型快速教程
- JVM如何处理锁
翻译自: https://www.javacodegeeks.com/2011/08/perfect-singleton.html
单身数字