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

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

Java 1.5之前,实现Singleton有两种方式,都要把构造器保持为私有,并导出共有的静态成员,以便能访问该类的唯一实例。

方法一:公有静态成员是个final域。

但是要注意可以借助AccessibleObject.setAccessible方法,通过反射机制调用私有构造器,破坏单例的初衷!(为了破解,可以在构造器中进行判断,创建第二个实例时抛出异常。)

方法二:公有的成员是个静态工厂方法。

同样也能被反射机制破坏

使Singleton类变成是可序列化的。仅仅“implements Serializable”是不够的,因为每次反序列化一个序列化的实例时,都会创建一个新的实例。为了保持单例需要下面这个readResolve方法。


第三种方法,单元素的枚举类型:

与公有域方法相近,但是更简洁,提供了序列化机制,防止多次实例化

单元素的枚举类型已经成为了实现Singleton的最佳方式。

链接:https://www.jianshu.com/p/4a139fa9c9a8

你可能感兴趣的:(3.用私有构造器或者枚举类型强化Singleton属性)