完美单身

我不时遇到一些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. 困难的方式(或者您使用1.4或更旧的Java)
    您需要在Singleton类中实现readResolve方法。 这个小东西用来覆盖已创建的序列化机制。 您返回的内容将用于代替序列化产生的数据(有关详细信息,请参见: Serializable Javadoc )。 只需在此处返回您的实例:
    ...
        protected Object readResolve() throws ObjectStreamException {
            return INSTANCE;
        }
    ...
  2. 简单方法(是的,我使用的是1.5或更高版本)
    将您的单例类更改为枚举,并删除私有构造函数和getInstance方法。 是的,就是这么简单。 然后,您可以免费获得它。
    public enum SafeSingleton implements Serializable {
    
        INSTANCE;
    }

在实施下一个Singleton时,请记住这一点。 如果大量使用RMI,可以使您的生活更轻松。

参考:来自我们的JCG合作伙伴 Marek Piechut的《完美单身汉》,在《 发展世界》中

相关文章 :

翻译自: https://www.javacodegeeks.com/2011/08/perfect-singleton.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值