一、enum關(guān)鍵字enum關(guān)鍵字是在Java1.5也就是Java SE5之后引入的一個新特性:它通過關(guān)鍵字enum來定義一個枚舉類,這個被定義的枚舉類繼承Enum類,這個枚舉類算是一種特殊類,它同樣能像其他普通類一樣擁有構(gòu)造器、方法,也能夠?qū)崿F(xiàn)接口,但是它不能再繼承其他別的類,因為它的直接父類是Enum類,并且因為它默認(rèn)的修飾符有final的存在,因此它無法直接派生出其他子類,除非將其使用abstract修飾。
在枚舉類出現(xiàn)之前Java是將常量放在接口或是放在普通類當(dāng)中,然后使用public、static、final去修飾定義的常量,如下兩個例子: 在枚舉類型出現(xiàn)之后,就可以使用枚舉類型來定義常量,這些枚舉類型成員_1、_2、_3都默認(rèn)被public、static、final修飾,語法如下: 但是Java枚舉類型輸出其常量的時候不像C /C++的枚舉那樣是數(shù)字,輸出的是其常量名,如果需要輸出其類型成員聲明時數(shù)字次序的話,需要調(diào)用ordinal()方法: 二、枚舉單例的實現(xiàn)單例模式的特點有以下三個:
我們可以發(fā)現(xiàn)枚舉類型十分契合以上三個特點,并且我們通過創(chuàng)建枚舉類型,可以發(fā)現(xiàn)它其中每一個類型成員其實都是Singleton2這個枚舉類的一個實例。 public enum Singleton2 { SHERLOCK } class Main{ public static void main(String[] args) { Singleton2 sherlock = Singleton2.SHERLOCK; Singleton2 sherlock1 = Singleton2.SHERLOCK; System.out.println(sherlock == Singleton2.SHERLOCK); System.out.println(sherlock == sherlock1); System.out.println(Singleton2.SHERLOCK.getDeclaringClass()); } } 輸出結(jié)果: true true class com.sherlock.singleton.Singleton2 利用這個特性,我們就可以通過如下代碼創(chuàng)建單例,同時又因為這個特性,決定了它只能屬于餓漢式單例模式 public enum Singleton2 { SHERLOCK; public void print() { System.out.println("I am Sherlock!"); } } class Main{ public static void main(String[] args) { Singleton2 sherlock = Singleton2.SHERLOCK; System.out.println(Singleton2.SHERLOCK.getDeclaringClass()); sherlock.print(); } } 輸出結(jié)果如下: 三、枚舉單例的優(yōu)缺點優(yōu)點: (1)能夠避免多線程同步問題; (2)能夠防止反序列化重新創(chuàng)建對象; (3)實現(xiàn)比起其它懶漢式、餓漢式單例來說十分簡潔,閱讀性好; 缺點: (1)因為是餓漢式加載,所以會導(dǎo)致枚舉實例會長期存在于內(nèi)存當(dāng)中; |
|