Effective Java(3) --用私有构造器或者枚举类型强化Singleton属性

这一节,主要讲得是单例设计模式.关于单例设计模式的详细介绍,可以移步runoob:
http://www.runoob.com/design-pattern/singleton-pattern.html

Singleton指仅仅被实例化一次的类.

在Java1.5之前,实现Singleton有两种方法(饿汉式,懒汉式),这两种方法都将构造器保持为私有,并导出共有的静态成员.

有一点需要注意的是,不管事饿汉式,还是懒汉式,享有特权的客户端可以借助AccessibleObject.setAccessible方法,通过反射机制调用私有构造器.如果需要抵御这种攻击,可以修改构造器,让它在被要求创建第二个实例的时候抛出异常.

无论是饿汉式,还是懒汉式,想要变成可序列化(Serializable),仅仅在声明上”implements Serializable”是不够的.为了维护并保证Singleton,必须声明所有实例域都是瞬时(transient)的,并提供一个readResolve方法.否侧,每次反序列化时,都会创建一个新的实例.

private Object readResolve(){
    return INSTANCE;
}

在Java1.5之后,实现Singleton还有第三种方法.只需编写一个包含单个元素的枚举类型:

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

这种方法在功能上与公有域方法相近,但是它更加简洁,无偿地提供了序列化机制,即便在面对复杂的序列化或者反射攻击的时候,也可以绝对防止多次实例化.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值