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

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!");
}
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容