1、枚舉單例模式的實現
public enum Singleton {
INSTANCE {
@Override
protected void read() { System.out.println("read"); } @Override protected void write() { System.out.println("write"); } }; protected abstract void read(); protected abstract void write(); }
2、枚舉單例模式的優點
1、線程安全
原因:從反編譯后的類源碼中可以看出也是通過類加載機制保證的反編譯后的源碼
public abstract class Singleton extends Enum { private Singleton(String s, int i) { super(s, i); } protected abstract void read(); protected abstract void write(); public static Singleton[] values() { Singleton asingleton[]; int i; Singleton asingleton1[]; System.arraycopy(asingleton = ENUM$VALUES, 0, asingleton1 = new Singleton[i = asingleton.length], 0, i); return asingleton1; } public static Singleton valueOf(String s) { return (Singleton)Enum.valueOf(singleton/Singleton, s); } Singleton(String s, int i, Singleton singleton) { this(s, i); } public static final Singleton INSTANCE; private static final Singleton ENUM$VALUES[]; static { INSTANCE = new Singleton("INSTANCE", 0) { protected void read() { System.out.println("read"); } protected void write() { System.out.println("write"); } }; ENUM$VALUES = (new Singleton[] { INSTANCE }); } }
2、不會因為序列化而產生新實例
不會因為序列化而產生新實例原因:枚舉類自己實現了readResolve()方法,所以抗序列化,這個方法是當前類自己實現的(待驗證)防止反射攻擊
3、防止反射攻擊
由反編譯類源碼可知單例類的修飾是abstract的,所以沒法實例化。