枚舉單例的實現(xiàn)方法:
class Resource{}
public enum SomeThing {
INSTANCE;
private Resource instance;
SomeThing() {
instance = new Resource();
}
public Resource getInstance() {
return instance;
}
上面的類Resource是我們要應用單例模式的資源,具體可以表現(xiàn)為網(wǎng)絡連接,數(shù)據(jù)庫連接,線程池等等。
獲取資源的方式很簡單,只要#SomeThing.INSTANCE.getInstance() 即可獲得所要實例。下面我們來看看單例是如何被保證的:
首先,在枚舉中我們明確了構造方法限制為私有,在我們訪問枚舉實例時會執(zhí)行構造方法,同時每個枚舉實例都是static final類型的,也就表明只能被實例化一次。在調用構造方法時,我們的單例被實例化。
也就是說,因為enum中的實例被保證只會被實例化一次,所以我們的INSTANCE也被保證實例化一次。
可以看到,枚舉實現(xiàn)單例還是比較簡單的,除此之外我們再來看一下Enum這個類的聲明:
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable
可以看到,枚舉也提供了序列化機制。某些情況,比如我們要通過網(wǎng)絡傳輸一個數(shù)據(jù)庫連接的句柄,會提供很多幫助。
最后借用 《Effective Java》一書中的話,
單元素的枚舉類型已經(jīng)成為實現(xiàn)Singleton的最佳方法。