【读书笔记 - Effective Java】03. 用私有构造器或者枚举类型强化Singleton属性
实现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...
}
【读书笔记 - Effective Java】03. 用私有构造器或者枚举类型强化Singleton属性的更多相关文章
- 《Effective Java》-——用私有构造器或者枚举类型强化Singleton属性
		Singleton指仅仅被实例化一次的类.Singleton通常被用来代表那些本质上唯一的系统组件,比如窗口管理器或者文件系统.使类成为Singleton会使它的客户端测试变得十分困难,因为无法给Si ... 
- Effective Java 之 --- 用私有构造器或者枚举类型强化Singleton属性
		Singleton指仅仅被实例化一次的类,通常用来代表那些本质上唯一的系统组件,实现Singleton有三种方法: 1)公有静态成员是个final域,享有特权的用户可以调用AccessibleObje ... 
- 《effective java》读书札记第三条用私有构造器或者枚举类型强化Singleton属性
		Singleton指只被实例化一次的类.一般用来搞那些创建很耗资源或者要求系统中只能有一个实例的类. 这个很经常使用.记得曾经实习面试的时候就有这个面试题. 一般採用的方法是将构造器私有化,然后提供一 ... 
- 创建和销毁对象——用私有构造器或者枚举类型强化Singleton属性
		参考资料:<Effective Java>.<Java核心技术 卷1>.https://www.cnblogs.com/zhaosq/p/10135362.html 基础回顾 ... 
- 用私有构造器或者枚举类型强化Singleton属性
		1.Singleton指仅仅被实例化一次的类.Singleton通常被用来代表那些本质上唯一的系统组件,如窗口管理器或者文件系统.使类称为Singleton会使它的客户端调试变的十分困难,因为无法给S ... 
- 第3条:用私有构造器或者枚举类型强化Singleton属性
		Singleton是指仅仅被实例化一次的类.通过被用来代表那些本质上唯一的系统组件,比如窗口管理器或者文件系统. 在http://www.cnblogs.com/13jhzeng/p/5256424. ... 
- 第3项:用私有构造器或者枚举类型强化Singleton属性
		Singleton指仅仅被实例化一次的类 [Gamma95].Singleton通常代表无状态的对象,例如函数(第24项)或者本质上唯一的系统组件.使类称为Singleton会使它的客户端测试变得 ... 
- 第三条:用私有构造器或者枚举类型强化Singleton属性
		1.使用单元素的枚举类型 public enum Singleton implements Serializable { INSTANCE; private String field; public ... 
- 用私有构造器或枚举类型强化Singleton
		Singleton指只有一个实例的类,只能被创建一次. 在Java1.5之前实现Singleton有两种方式,都是将构造器设为private并导出公有的静态成员实例. 第一种方式将公有的静态成员实例设 ... 
随机推荐
- 02_zookeeper配置
			[zoo.cfg] * tickTime:用于计算的时间单元.比如session超时:N*tickTime * initLimit:用于集群,允许从节点连接并且同步到master节点的初始化连接时间, ... 
- Retrofit 抽象工厂模式
			https://blog.csdn.net/h176nhx7/article/details/78139371 
- Jmeter对HTTP请求压力测试、并发测试
			最近公司需要开发一个简单的报名系统,供外网用户提供报名服务,由于我们公司是个初创的微型公司,开发人员都是刚毕业不久,开发经验相当缺乏. 对于服务器性能测试这块的经验更是少得可以忽略.迫使不得不让我们去 ... 
- C# GDI+ 利用 Rectangle GraphicsPath 判断 矩形或多边形 图形关系
			最近在做一些简单的图像对比工作,总结了一些GDI+对象的使用方式,记录下来共享给大家使用. 判断Rectangl与多边形的关系 /// <summary> /// 是否包含输入范围 /// ... 
- java断言 assert
			关于assert的用法网上教程很多,这里就不说了,只演示一下运行时开启断言的方法. public class A{ public static void main(String[] args){ Cl ... 
- 并发包Semaphore实现信号灯
			/** * * @描述: Semaphore实现信号灯 . * Semaphore可以维护当前访问自身的线程个数,并提供了同步机制,使用Semaphore可以控制同时访问资源的线程个数,例如实现一个文 ... 
- 学习笔记---Javascript事件Event、IE浏览器下的拖拽效果
			学习笔记---Javascript事件Event.IE浏览器下的拖拽效果 1. 关于event常用属性有returnValue(是否允许事件处理继续进行, false为停止继续操作).srcE ... 
- Python学习---重点模块之configparse
			configparse模块常用于生成和修改常见的配置文档 生成配置模块:用字典写 import configparser config = configparser.ConfigParser() co ... 
- 使用redis存放 map数据
			效果 实现 public class JedisPoolUtil { /** * 获取一个redis实例 * @param jedisConnectionFactory * @return */ pu ... 
- 全文检索及ElasticSearch框架学习
			1. 全文检索的通用步骤: 1.建库步骤: a 分词 b 倒排索引 : 关键词和记录Id的对应关系,1对多. 2.查询步骤: a 分词 b 查索引 c 取交集或并集 2. 产品使用全文 ... 
