1. 程式人生 > >用列舉實現單例

用列舉實現單例

最近看同事的老程式碼有這麼個類,一時之間真沒看明白.找同事一解釋才知道這使用列舉實現的一個單例.

忽然感覺就這麼簡單的單例就水平立馬見高下.

public enum RedisPlugin implements Plugin {

INSTANCE;

public static RedisPlugin me() {
        return INSTANCE;
    }

}

於是我花了一上午才弄明白上面的程式碼究竟是什麼意思.

Enum類是java.lang包中一個類,他是Java語言中所有列舉型別的公共基類。

原始碼中定義如下

public abstract class Enum<E

extends Enum<E> > implements Comparable<E>,Serializable

這是個抽象類不能例項化,而且它還不可以被繼承

enum Color{RED,BLUE,GREEN}

對這個列舉類進行反編譯會得到如下類檔案

public final class Color extends Enum<Color>{  

public static final Color[] values() { return (Color[])$VALUES.clone(); }  

public static Colorvalue Of

(String name){ ... }  

private Color(String s,int i){

super(s, i); 

}  

public static final Color RED;  

public static final Color BLUE;  

public static final Color GREEN;  

privates tatic final Color $VALUES[];  

static {  

RED = new Color("RED",0);  

BLUE = new Color("BLUE",1);  

GREEN =

new Color("GREEN",2);  

$VALUES = (new Color[] { RED, BLUE, GREEN });  

}

}

當我們使用enum關鍵字定義一個列舉的時候,他會幫我們在編譯後預設繼承java.lang.Enum類,而不像其他的類一樣預設繼承Object類。且採用enum聲明後,該類會被編譯器加上final宣告,故該類是無法繼承的。 PS:由於JVM類初始化是執行緒安全的,所以可以採用列舉類實現一個執行緒安全的單例模式。

列舉建構函式的作用以及使用

public enum Light {

   // 利用建構函式傳參

   RED (1), GREEN (3), YELLOW (2);



   // 定義私有變數

   private int nCode ;



   // 建構函式,列舉型別只能為私有

   private Light( int _nCode) {

       this . nCode = _nCode;

   }



   @Override

   public String toString() {

       return String.valueOf ( this . nCode );

   }

} 

這裡的RED(1)就是呼叫了建構函式。這個類主要的功能,是把列舉值輸出。譬如RED的值到底是什麼呢?通過建構函式RED(1),我們知道RED的值是1 。當然也可以是RED(“紅燈”)這樣的實現方式。Java貌似會預設提供1的值。


這次等級定為中上一部分原因是向高手致敬,那位老同事的技術水平的確可以排到中上了!