用列舉實現單例
最近看同事的老程式碼有這麼個類,一時之間真沒看明白.找同事一解釋才知道這使用列舉實現的一個單例.
忽然感覺就這麼簡單的單例就水平立馬見高下.
public enum RedisPlugin implements Plugin {
INSTANCE;
public static RedisPlugin me() {
return INSTANCE;
}
}
於是我花了一上午才弄明白上面的程式碼究竟是什麼意思.
Enum類是java.lang包中一個類,他是Java語言中所有列舉型別的公共基類。
原始碼中定義如下
public
abstract
class
Enum<E
這是個抽象類不能例項化,而且它還不可以被繼承
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
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
=
$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的值。
這次等級定為中上一部分原因是向高手致敬,那位老同事的技術水平的確可以排到中上了!