美文网首页
用私有构造器或者枚举类型强化Singleton 属性

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

作者: 境里婆娑 | 来源:发表于2019-05-26 16:44 被阅读0次

Singleton 是仅仅被实例化一次,Singleton通常被代表一个无形状对象
实现Singleton有两种常见的方法。这两种构造器方法都要保持构造器私有,并导出公有的静态成员,以便客户端能够访问该类的唯一实例
第一种方法为公有静态成员final域

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

私有构造器仅被调用一次,用来实例化公有的静态final 域Elvis.INSTANCE。由于缺少公有的或者受保护的构造器,所以保证了Elvis 的全局唯一性: 一旦Elvis 类被实例化,将只会存在一个Elvis 实例,不多也不少。客户端的任何行为都不会改变这一点, 但要提醒一点:享有特权的客户端可以借助AccessibleObject.setAccessible 方法,通过反射机制调用私有构造器。如果需要抵御这种攻击,可以修改构造器,让它在被要求创建第二个实例的时候抛出异常。

第二种方法

public class Elvis{
public static final Elvis INSTANCE = new Elvis();
public static Elvis getinstance() {return INSTANCE; }
private Elvis() {}
}

对于静态方法ElviS . getinstance 的所有调用,都会返回同一个对象引用,所以,
永远不会创建其他的Elvis 实例(上述提醒依然适用) 。

第三种方法使用枚举创建Singleton

public enum Singleton{
INSTANCE;
public void dosomething()
{
System.out.println(this + " is speaking!");
}
}

相关文章

网友评论

      本文标题:用私有构造器或者枚举类型强化Singleton 属性

      本文链接:https://www.haomeiwen.com/subject/qnhftctx.html