完美的单例实现(The Perfect Singleton)

简介:

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

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

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

1 public final class NonSafeSingleton implements Serializable {
2     private static final NonSafeSingleton INSTANCE = new NonSafeSingleton();
3     private NonSafeSingleton() {}
4     public static NonSafeSingleton getInstance() {
5         return INSTANCE;
6     }
7 }

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

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

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

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

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

1 public enum SafeSingleton implements Serializable {
2    INSTANCE;
3 }

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

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

Related Articles :

 

相关文章
|
运维 负载均衡 安全
架构图怎么画?
架构图怎么画?
|
12月前
|
存储 前端开发 JavaScript
React useState 和 useRef 的区别
本文介绍了 React 中 `useState` 和 `useRef` 这两个重要 Hook 的区别和使用场景。`useState` 用于管理状态并在状态变化时重新渲染组件,适用于表单输入、显示/隐藏组件、动态样式等场景。`useRef` 则用于在渲染之间保持可变值而不触发重新渲染,适用于访问 DOM 元素、存储定时器 ID 等场景。文章还提供了具体的代码示例,帮助读者更好地理解和应用这两个 Hook。
359 0
|
机器学习/深度学习 存储 数据采集
强化学习系列:A3C算法解析
【7月更文挑战第13天】A3C算法作为一种高效且广泛应用的强化学习算法,通过结合Actor-Critic结构和异步训练的思想,实现了在复杂环境下的高效学习和优化策略的能力。其并行化的训练方式和优势函数的引入,使得A3C算法在解决大规模连续动作空间和高维状态空间的问题上表现优异。未来,随着技术的不断发展,A3C算法有望在更多领域发挥重要作用,推动强化学习技术的进一步发展。
|
机器学习/深度学习 人工智能 算法
探索人工智能在农业领域的应用与前景
当谈到人工智能的应用领域时,农业往往被人们忽略。然而,人工智能技术在农业领域的应用正日益成为研究热点。本文将探讨人工智能在农业中的潜在应用价值和未来发展前景,揭示其在提高农业生产效率、资源利用和环境保护方面的巨大潜力。
303 2
|
Windows
Windows【工具 01】视频下载工具BBDown.exe详细使用说明(https://github.com/nilaoda/BBDown)mp4格式无法识别问题处理(最新版本1.6.1网盘分享)
Windows【工具 01】视频下载工具BBDown.exe详细使用说明(https://github.com/nilaoda/BBDown)mp4格式无法识别问题处理(最新版本1.6.1网盘分享)
1208 0
|
监控 安全 测试技术
CLAS:用于软件定义网络SDN的协作分层架构
网络软件化的进步正在促进在电信运营商的服务和基础设施中引入可编程性。这通常是通过在网络中引入软件定义网络 (SDN) [RFC7149] [RFC7426] 功能来实现的,包括控制器和协调器。
780 0
CLAS:用于软件定义网络SDN的协作分层架构
|
自然语言处理 算法 Shell
五分钟搞定Docker安装ElasticSearch
五分钟搞定Docker安装ElasticSearch
6912 0
五分钟搞定Docker安装ElasticSearch
|
存储 Prometheus 监控
Prometheus(普罗米修斯)监控系统
Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,由 SoundCloud 公司开发。
13804 1
Prometheus(普罗米修斯)监控系统
kibana6.x版本汉化
kibana6.x版本汉化 文章目录 kibana6.x版本汉化 1.kibana汉化前 2.汉化kibana 2.1.下载汉化包 2.2.开始汉化 2.3.重启kibana 3.汉化以后的样子
645 0
kibana6.x版本汉化