完美的单例实现(The Perfect Singleton)
  TEZNKK3IfmPf 2023年11月15日 28 0

原文链接  作者: Marek Piechut    译者:陈振阳

我经常遇到一些这样的Java程序员,他们不确定应该如何恰当的实现单例模式。

我不考虑在线程的环境中合适的实现。但是使用你能在网络上找到的大多数常见的实现方式,你可以轻松地创建你想要的多种单例实现。

假设你有下面这种常见的单例的实现:

public final class NonSafeSingleton implements Serializable {
    private static final NonSafeSingleton INSTANCE = new NonSafeSingleton();
    private NonSafeSingleton() {}
    public static NonSafeSingleton getInstance() {
        return INSTANCE;
    }
}

现在,注意到Serializable 这个单词。思考一会…..你是对的。如果通过RMI发送上边的代码,你将会得到第二个实例。它应该足够可以做一些内存中的序列化和反序列化操作。你刚刚违反了单例的规则。那不是很好。但是如何修复它?通常我会用两种方式:

  1. 困难的方式(如果你用4或者更老的版本)

你需要在你的单例类中实现一个readResolve方法。这通常用来重写序列化机制已经创建的内容。在这个方法里返回的是用来代替来自序列化的数据。这里仅需要返回你的实例:

...  
protected Object readResolve() throws ObjectStreamException {      
   return INSTANCE;  
}
...
  1. 简单的方式(如果你用5或更新的版本)

将你的单例类改成枚举类型,然后移除私有构造方法和getInstance方法。下面,真的很简单。然后你将免费得到下面这个:

public enum SafeSingleton implements Serializable {
   INSTANCE;
}

当你再实现单例模式时,记住这些。如果你大量的使用RMI,它可以使你的生活更加简单。

Reference: The Perfect Singleton from our JCG partner Marek Piechut at the Development world stories.

Related Articles :

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2023年11月15日   49   0   0 java在线
  TEZNKK3IfmPf   2023年11月15日   22   0   0 java在线
  TEZNKK3IfmPf   2023年11月15日   18   0   0 java在线
  TEZNKK3IfmPf   2023年11月15日   24   0   0 java在线
  TEZNKK3IfmPf   2023年11月15日   21   0   0 java在线
  TEZNKK3IfmPf   2023年11月15日   23   0   0 API数据接口java在线
  TEZNKK3IfmPf   2023年11月15日   27   0   0 java在线
  TEZNKK3IfmPf   2023年11月15日   59   0   0 java在线
TEZNKK3IfmPf