【读书笔记 - Effective Java】03. 用私有构造器或者枚举类型强化Singleton属性
2024-09-01 23:03:36
实现Singleton(代表本质上唯一的系统组件)的三种方法:
1. 保持私有构造器,导出公有的静态成员,客户端访问该类的唯一实例。
2. 保持私有构造器,公有的成员是静态工厂方法。
3. 单元素的枚举类型已经成为实现Singleton的最佳方法。
前两种方法有两点注意:
1. 享有特权的客户端可以通过反射机制调用私有构造器。如果需要抵御这种攻击,可以修改构造器,让它在被要求创建第二个实例的时候抛出异常。
2. 如果要使其变成可序列化的,需要:
(1) implement Serializable;
(2) 声明所有实例域是瞬时(transient)的;
(3) 提供一个返回唯一实例instance的readResolve方法(因为每次反序列化一个序列化的实例时,都会创建一个新的实例)。
示例1:公有域——性能没有优势,但是组成类的成员声明清楚表明这是一个单例类。公有静态域是final的,总是包含相同的对象引用。
public class Elvis {
public static final Elvis instance = new Elvis();
private Elvis() { }
// method...
}
示例2:静态工厂方法——提供了灵活性,改变是否是单例类。但是很容易被修改。
public class Elvis {
private static final Elvis instance = new Elvis();
private Elvis() { }
public static Elvis getInstance() {
return instance;
}
// method...
}
示例3:单元素枚举——与公有域方法相近,但没有前面说的两个注意。无偿提供了序列化机制,绝对防止多次实例化。
public enum Elvis {
instance;
// method...
}
最新文章
- 【干货分享】流程DEMO-借款申请
- shll 变量
- 移动App崩溃的测试用例设计
- js判断用户浏览器是PC还是手机,自动跳转
- IKAnalyzer进行中文分词和去停用词
- 阅读jQuery源码的18个惊喜
- 一个有趣的模拟光照的shader(类似法线贴图)
- 安装.NET Framework组件时,电脑意外重启后再次安装失败
- 用js 将long类型转换成日期格式
- mysql Group By
- Win10系统安装Tomcat8
- Jira与Confluence集成、授权信息查看和问题汇总
- JavaScript中如何理解如何理解Array.apply(null, {length:5})
- Linux中DHCP服务器的简单配置
- 使用Jmeter监测服务器性能指标
- css 选择其父元素下的某个元素
- CSS的六大选择器
- 【读书笔记】iOS-如何选择本地化应用
- .net源码调试 http://referencesource.microsoft.com/
- Javascript、Jquery获取浏览器和屏幕各种高度宽度(单位都为px)
热门文章
- 十、一行多个:使用float布局的经典方法 ---接(一)
- Linux->;Ubuntu配置tomcat开机自动启动
- linux系统开机突然黑屏,只有光标
- [零基础学JAVA]Java SE面向对象部分.面向对象基础(02)
- tp5.0和tp3.2中前台模板IF标签和FOREACH的区别
- TensorFlow基础(三)激活函数
- C#使用DotNetZip对zip压缩包进行添加删除操作
- Redis数据类型(上)
- Tomcat生命周期
- python -- @classmethod @staticmethod区别和使用