1. 程式人生 > >用私有構造器或列舉型別強化Singleton屬性

用私有構造器或列舉型別強化Singleton屬性

單例 Singleton 指僅僅被例項化一次的類,Singleton 通常被用來代表本質上唯一的系統元件
實現Singleton有兩種方法,兩種方法都要把構造器私有化
並匯出公有的靜態成員.
1.

  public class Elvis{
    public static final Elvis INSTANCE=new Elvis();
    private Elvis(){}
    public void leavetThebuilding(){...}
    }

私有構造器僅被呼叫一次,缺少公有或受保護的構造器,保證了全域性唯一性,一旦被例項化,只會存在一個Elvis例項,但是客戶端可以利用反射 AcccessilblObject.setAccessilble方法呼叫私有構造器.
如需要抵抗這種攻擊,可以修改構造器,他被要求建立第二個例項的時候丟擲異常

實現Singleton的第二種方法

  public class Elvis{
    private static final Elvis INSTANCE=new Elvis();
    private Elvis(){}
    public static Elvis getInstance(){ return    INSTANCE;}
    public void leavetThebuilding(){...}
    }

考慮到序列化的情況,每次反序列化一個序列化例項時,都會建立一個新的例項,為反正這種情況需要在Elvis 類中加入readResolve方法
public Object readResolve(){
return INSTANCE;
}

3 列舉方式
public enum Elvis {
INSTANCE;
public void leavetThebuilding(){…}
}