用私有构造器或者枚举类型强化Singleton属性*

java 1.5之前

方法1     私有构造器,公有静态final域

public class Elvis(){
   public static final Elvis INSTANCE = new Elvis();
   private Elvis(){}
   public void leaveTheBuilding(){}
}

缺点:享有特权的客户端可以通过AccessibleObject.setAccessible方法,通过反射机制调用构造器。

解决:修改构造器,让它被要求创建第二个实例时抛出异常。

方法2     私有构造器,私有公有静态final域,公有静态工厂方法。

public class Elvis(){
   private static final Elvis INSTANCE = new Elvis();
   private Elvis(){}
   public static Elvis getInstance(){ return INSTANCE;}
   public void leaveTheBuilding(){}
}
缺点:每次被反序列化一个序列化的实例时,都会创建一个新的实例。

解决:实现Serializable接口,申明所有实例域都是瞬时(transient)的,提供readResolve方法。

Java1.5后

方法3     单元素的枚举类型

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

优点:功能上与公有域方法接近,无偿提供序列化机制,绝对防止多次实例化。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值