Item3、單一實例的屬性應為列舉類型或使用private建構子
單一實例就是該類別只實體化一次,但是除非它有是實作對應的類型介面,不然很難進行測試。在1.5之前有2種方法實現單一實例,主要就是限制private建構子跟public 靜態成員。
public class Elvis{
public static final Elvis INSTANCE = new Evlis();
private Elvis(){....}
}
這邊將Elvis類別的實力指向該類別public 靜態成員,但是這種做法有個漏洞:如果使用AccessibleObject.setAxccessible方法就可以進行攻擊,所以可以改成:
public class Elvis{
private static final Elvis INSTANCE = new Evlis();
private Elvis(){....}
public static Elvis getInstance(){ return INSTANCE;}
}
在1.5之後最簡單的做法就是用列舉(Enum)
public enum Elvis{
INSTANCE;
}