天天看點

用私有構造器或枚舉類型強化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(){…}

}

繼續閱讀