用私有構造器或列舉型別強化Singleton屬性
阿新 • • 發佈:2018-11-23
單例 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(){…}
}