单例模式作为最常见的设计模式之一,一直是面试中的热点问题,常用的饿汉式懒汉式等单例写法总会有各种各样的不足,特别涉及到反射与序列化问题时,这些常用的单例写法都得做特殊处理才能保证对象实例唯一性,具体原因请自行百度。
每个介绍单例写法的文章总会提到枚举单例模式,但由于枚举引入较晚,熟悉的人不多,总会让人感觉无法理解其好处与优势,其实枚举单例乃是最完美的单例模式写法,没有之一,所有上面所提到的其它写法的不足之处在枚举单例写法中都被完美解决,下面介绍几种枚举单例写法并介绍其原理。
接口实现形式
对于一个标准的enum单例模式,最优秀的写法还是实现接口的形式:
// 定义单例模式中需要完成的代码逻辑
public interface MySingleton {
void doSomething();
}
public enum Singleton implements MySingleton {
INSTANCE {
@Override
public void doSomething() {
System.out.println("complete singleton");
}
};
public static MySingleton getInstance() {
return Singleton.INSTANCE;
}
}
内部枚举类形式
1.构造方法中实例化对象
public class EnumSingleton {
private EnumSingleton(){}
public static EnumSingleton getInstance(){
return Singleton.INSTANCE.getInstance();
}
private enum Singleton{
INSTANCE;
private EnumSingleton singleton;
//JVM会保证此方法绝对只调用一次
Singleton(){
singleton = new EnumSingleton();
}
public EnumSingleton getInstance(){
return singleton;
}
}
}
2.枚举常量的值即为对象实例
public class EnumSingleton {
private EnumSingleton(){}
public static EnumSingleton getInstance(){
return Singleton.INSTANCE.getInstance();
}
private enum Singleton{
INSTANCE(new EnumSingleton());
private EnumSingleton singleton;
//JVM会保证此方法绝对只调用一次
Singleton(EnumSingleton singleton){
this.singleton = singleton;
}
public EnumSingleton getInstance(){
return singleton;
}
}
}
总结,JVM会保证枚举类构造方法绝对只调用一次,所以保证了对象实例的唯一性。