簡(jiǎn)書(shū) 占小狼
轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處,謝謝!
enum實(shí)現(xiàn)
JDK5中提供了Java枚舉類(lèi)型的實(shí)現(xiàn),與其說(shuō)是一種新類(lèi)型,倒不如說(shuō)是一種語(yǔ)法糖。
public enum Season {
SPRING,
SUMMER,
AUTUMN,
WINTER
}
通過(guò)反編譯工具 jad來(lái)看看這段代碼是如何實(shí)現(xiàn)的,反編譯后的代碼如下:
public final class Season extends Enum {
public static Season[] values() {
return (Season[])$VALUES.clone();
}
public static Season valueOf(String s) {
return (Season)Enum.valueOf(Season, s);
}
private Season(String s, int i) {
super(s, i);
}
public static final Season SPRING;
public static final Season SUMMER;
public static final Season AUTUMN;
public static final Season WINTER;
private static final Season $VALUES[];
static {
SPRING = new Season("SPRING", 0);
SUMMER = new Season("SUMMER", 1);
AUTUMN = new Season("AUTUMN", 2);
WINTER = new Season("WINTER", 3);
$VALUES = (new Season[] {
SPRING, SUMMER, AUTUMN, WINTER
});
}
}
通過(guò)反編譯的代碼可以發(fā)現(xiàn):
1、Season是一個(gè)普通的類(lèi),繼承自Enum,并通過(guò)final關(guān)鍵字修飾,避免被繼承,
2、枚舉中的SPRING、SUMMER、AUTUMN和WINTER是Season類(lèi)的靜態(tài)實(shí)例,并在類(lèi)構(gòu)造器<clinit>方法中進(jìn)行初始化。
3、values()方法返回私有變量$VALUES[]的副本,$VALUES[]也是在<clinit>方法中進(jìn)行初始化。
如何使用enum
1、單例模式
在JVM類(lèi)加載的那些事中,我們已經(jīng)知道類(lèi)構(gòu)造器<clinit>只能被一個(gè)線(xiàn)程在類(lèi)加載的初始化階段進(jìn)行執(zhí)行,所以枚舉的每個(gè)實(shí)例在Java堆中有且只有一個(gè)副本,這種特性讓枚舉很容易就實(shí)現(xiàn)了單例模式,這也正是Effective Java作者 Josh Bloch 提倡使用實(shí)現(xiàn)單利模式的方式。
public enum Singleton { INSTANCE;}
2、在switch中使用
3、自定義字段和方法
enum中除了默認(rèn)字段和方法之外,可以針對(duì)業(yè)務(wù)邏輯進(jìn)行自定義。
public enum EnumTest {
PLUS("+") {
@Override
public int bind(int arg1, int arg2) {
return arg1 + arg2;
}
},
SUB("-") {
@Override
public int bind(int arg1, int arg2) {
return arg1 - arg2;
}
};
final String operation;
EnumTest(String operation) {
this.operation = operation;
}
abstract int bind(int arg1, int arg2);
}
4、實(shí)現(xiàn)接口
interface Operation{
int operate(int arg1, int arg2);
}
public enum EnumTest implements Operation {
PLUS("+") {
@Override
public int operate(int arg1, int arg2) {
return arg1 + arg2;
}
},
SUB("-") {
@Override
public int operate(int arg1, int arg2) {
return arg1 - arg2;
}
};
final String operation;
EnumTest(String operation) {
this.operation = operation;
}
}
在實(shí)際應(yīng)用中,可以把 "+"、"-" 作為key,PLUS和SUB作為value,預(yù)先保存在hashMap中,具體使用方式如下:
Operation operation = hashMap.get("+");
int result = operation.operate(1, 2);
END。
我是占小狼。
在魔都艱苦奮斗,白天是上班族,晚上是知識(shí)服務(wù)工作者。
如果讀完覺(jué)得有收獲的話(huà),記得關(guān)注和點(diǎn)贊哦。
非要打賞的話(huà),我也是不會(huì)拒絕的。