簡書 占小狼
轉載請注明原創出處,謝謝!
enum實現
JDK5中提供了Java枚舉類型的實現,與其說是一種新類型,倒不如說是一種語法糖。
public enum Season {
SPRING,
SUMMER,
AUTUMN,
WINTER
}
通過反編譯工具 jad來看看這段代碼是如何實現的,反編譯后的代碼如下:
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
});
}
}
通過反編譯的代碼可以發現:
1、Season是一個普通的類,繼承自Enum,并通過final關鍵字修飾,避免被繼承,
2、枚舉中的SPRING、SUMMER、AUTUMN和WINTER是Season類的靜態實例,并在類構造器<clinit>方法中進行初始化。
3、values()方法返回私有變量$VALUES[]的副本,$VALUES[]也是在<clinit>方法中進行初始化。
如何使用enum
1、單例模式
在JVM類加載的那些事中,我們已經知道類構造器<clinit>只能被一個線程在類加載的初始化階段進行執行,所以枚舉的每個實例在Java堆中有且只有一個副本,這種特性讓枚舉很容易就實現了單例模式,這也正是Effective Java作者 Josh Bloch 提倡使用實現單利模式的方式。
public enum Singleton { INSTANCE;}
2、在switch中使用
3、自定義字段和方法
enum中除了默認字段和方法之外,可以針對業務邏輯進行自定義。
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、實現接口
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;
}
}
在實際應用中,可以把 "+"、"-" 作為key,PLUS和SUB作為value,預先保存在hashMap中,具體使用方式如下:
Operation operation = hashMap.get("+");
int result = operation.operate(1, 2);
END。
我是占小狼。
在魔都艱苦奮斗,白天是上班族,晚上是知識服務工作者。
如果讀完覺得有收獲的話,記得關注和點贊哦。
非要打賞的話,我也是不會拒絕的。