簡(jiǎn)書 占小狼
轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處,謝謝!
enum實(shí)現(xiàn)
JDK5中提供了Java枚舉類型的實(shí)現(xiàn)瞒瘸,與其說(shuō)是一種新類型,倒不如說(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è)普通的類赌蔑,繼承自Enum俯在,并通過(guò)final關(guān)鍵字修飾,避免被繼承娃惯,
2跷乐、枚舉中的SPRING、SUMMER趾浅、AUTUMN和WINTER是Season類的靜態(tài)實(shí)例愕提,并在類構(gòu)造器<clinit>方法中進(jìn)行初始化馒稍。
3、values()方法返回私有變量$VALUES[]的副本浅侨,$VALUES[]也是在<clinit>方法中進(jìn)行初始化筷黔。
如何使用enum
1、單例模式
在JVM類加載的那些事中仗颈,我們已經(jīng)知道類構(gòu)造器<clinit>只能被一個(gè)線程在類加載的初始化階段進(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ù)工作者纺铭。
如果讀完覺得有收獲的話,記得關(guān)注和點(diǎn)贊哦刀疙。
非要打賞的話舶赔,我也是不會(huì)拒絕的。