枚舉單例的實(shí)現(xiàn)方法:
class Resource{}
public enum SomeThing {
INSTANCE;
private Resource instance;
SomeThing() {
instance = new Resource();
}
public Resource getInstance() {
return instance;
}
上面的類(lèi)Resource是我們要應(yīng)用單例模式的資源走诞,具體可以表現(xiàn)為網(wǎng)絡(luò)連接,數(shù)據(jù)庫(kù)連接蛤高,線程池等等蚣旱。
獲取資源的方式很簡(jiǎn)單,只要#SomeThing.INSTANCE.getInstance() 即可獲得所要實(shí)例戴陡。下面我們來(lái)看看單例是如何被保證的:
首先塞绿,在枚舉中我們明確了構(gòu)造方法限制為私有,在我們?cè)L問(wèn)枚舉實(shí)例時(shí)會(huì)執(zhí)行構(gòu)造方法恤批,同時(shí)每個(gè)枚舉實(shí)例都是static final類(lèi)型的异吻,也就表明只能被實(shí)例化一次。在調(diào)用構(gòu)造方法時(shí)喜庞,我們的單例被實(shí)例化诀浪。
也就是說(shuō),因?yàn)閑num中的實(shí)例被保證只會(huì)被實(shí)例化一次延都,所以我們的INSTANCE也被保證實(shí)例化一次雷猪。
可以看到,枚舉實(shí)現(xiàn)單例還是比較簡(jiǎn)單的晰房,除此之外我們?cè)賮?lái)看一下Enum這個(gè)類(lèi)的聲明:
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable
可以看到求摇,枚舉也提供了序列化機(jī)制射沟。某些情況,比如我們要通過(guò)網(wǎng)絡(luò)傳輸一個(gè)數(shù)據(jù)庫(kù)連接的句柄与境,會(huì)提供很多幫助验夯。
最后借用 《Effective Java》一書(shū)中的話,
單元素的枚舉類(lèi)型已經(jīng)成為實(shí)現(xiàn)Singleton的最佳方法嚷辅。