單例模式作為最常見的設(shè)計模式之一,一直是面試中的熱點問題,常用的餓漢式懶漢式等單例寫法總會有各種各樣的不足,特別涉及到反射與序列化問題時,這些常用的單例寫法都得做特殊處理才能保證對象實例唯一性,具體原因請自行百度。
每個介紹單例寫法的文章總會提到枚舉單例模式,但由于枚舉引入較晚,熟悉的人不多,總會讓人感覺無法理解其好處與優(yōu)勢,其實枚舉單例乃是最完美的單例模式寫法,沒有之一,所有上面所提到的其它寫法的不足之處在枚舉單例寫法中都被完美解決,下面介紹幾種枚舉單例寫法并介紹其原理。
接口實現(xiàn)形式
對于一個標準的enum單例模式,最優(yōu)秀的寫法還是實現(xiàn)接口的形式:
// 定義單例模式中需要完成的代碼邏輯
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;
}
}
內(nèi)部枚舉類形式
1.構(gòu)造方法中實例化對象
public class EnumSingleton {
private EnumSingleton(){}
public static EnumSingleton getInstance(){
return Singleton.INSTANCE.getInstance();
}
private enum Singleton{
INSTANCE;
private EnumSingleton singleton;
//JVM會保證此方法絕對只調(diào)用一次
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會保證此方法絕對只調(diào)用一次
Singleton(EnumSingleton singleton){
this.singleton = singleton;
}
public EnumSingleton getInstance(){
return singleton;
}
}
}
總結(jié),JVM會保證枚舉類構(gòu)造方法絕對只調(diào)用一次,所以保證了對象實例的唯一性。