Effective.Java 读书笔记(3)关于单例模式

来源:互联网 发布:阿里云手机刷机 编辑:程序博客网 时间:2024/06/06 09:37
3.Enforce the singleton property with a private constructor or an enum type
大意为 使用parivate的构造方法或者一个枚举的类型实现单例属性

一个单例即使一个类只初始化一次来简化这个类

特别地,单例代表一个内在独立的系统组件,比如窗口管理或者文件系统

使一个类成为单例这件事会使得难以测试它的用户,正如对于使用一个单例代替一个模拟实现除非它实现了一个接口,而这个接口作为它的类型的事是不可能的

release 1.5之前有着两种方法来实现单例,都是基于使构造方法private然后导入一个public的静态成员来提供唯一的实例,其中一种方法中,成员是一个final域

// Singleton with public final field
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public void leaveTheBuilding() { ... }
}

private的构造方法只调用一次,用来初始化public的静态final域中的Elivis.INSTANCE,一个public或者protected的构造方法的缺失保证了一个单例的存在,书中称为(”monoelvistic“ universe)

的确这样只有一个实例存在,用户不能改变它只有一个的事实,不管通过什么手段,需要注意的是,一个优先级别的用户可以通过使用AccessibleObject.setAccessible的帮助来重新调用private的构造方法,如果你需要预防这件事的发生,你可以定义构造方法当创建第二个实例的时候直接抛出一个异常

第二个方法来实现单例,即public的成员事一个静态工厂方法

// Singleton with static factory
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() { ... }
}

每次调用getInstance方法都会返回相同的一个对象的引用,并且没有其他实例会曾经被创建,和第一个方法一样需要预防强制调用

第一个方法的主要优点在于声明使这个类是单例这件事更加清晰,不再有其他的优点了,如今的JVM的实现大多数都是用使用静态工厂方法

使用第二个方法的优点在于给你更加强大的灵活性,你可以改变单例的模式而不需要更改API,工厂方法返回唯一实例但是可以简单改为返回实例,这样说,相应的被调用的线程的一个特殊的实例。

第二个优点是,关注通用类型,后面可能会说到,这些优点都不相关,只能说第一个方法更加简单。

为了使单例的类可以使用其他的以前的方法(Serializable可序列化)来实现,仅仅加上可序列化的实现并不足够,为了保持单例,你必须短暂声明所有的实例域并且提供readResolve方法(之后会提及),否则每次一个序列化了的实例都反序了

// readResolve method to preserve singleton property
private Object readResolve() {
// Return the one true Elvis and let the garbage collector
// take care of the Elvis impersonator(模仿者).
return INSTANCE;
}

1.5之后,有第三种方法实现单例,简单创建一个含一个元素的枚举类

public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}

这种方法和第一种方法功能上是相等的,相较之下更加地简洁明了,提供序列化功能并且提供稳固的保证来对抗多次实例的危险,甚至面对复杂的序列或者反复攻击的时候也可以提供安全保证,这种方法已经广泛被推广了,一个单一元素的枚举类型是实现单例的最好方式

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 初中分到差班怎么办 高中分到平行班怎么办 夏季皮肤起皮屑怎么办 皮肤局部起皮屑怎么办 嘴角两边起皮屑怎么办 嘴角旁边起皮屑怎么办 春季脸上起皮怎么办 手上起白皮屑怎么办 手背起皮干燥怎么办 不会读的英语怎么办 中学生不准时回家怎么办 汽车轮胎锈住了怎么办 新轮胎不好装怎么办 学it找不到工作怎么办 血液里有微生物怎么办 机械硬盘不显示怎么办 六安建筑机械租赁公司怎么办 别墅楼梯太陡怎么办 不锈钢楼梯太陡怎么办 真皮白色鞋脏了怎么办 白色牛皮包脏了怎么办 白色羊皮鞋脏了怎么办 白色真皮染色了怎么办 白色漆皮鞋脏了怎么办 对鉴定结果不服怎么办 洗衣机入水口堵塞怎么办 华科办临时饭卡怎么办 血浆乳酸测定高怎么办 olay大红瓶过敏怎么办 饥一顿饱一顿怎么办 朝鲜人向去韩国怎么办? 我是超级大方脸怎么办 被精神病砍断四根筋怎么办 40小时不睡觉怎么办 边防转业军人安置不好怎么办 转业军人孩子读书怎么办玉环 军官证丢了怎么办 飞行学员停飞了怎么办 丹东港债券违约怎么办 对村党支部贿选怎么办 马自达2油耗高怎么办