枚举类型 :枚举常量的一组集合,包含者一些操作方法,枚举类是不可变的,通常用作单实例操作。
包含的方法
自带静态方法 values() 返回枚举类中枚举常量数组 (按枚举常量声明的顺序返回)
toString()方法 返回枚举常量名称。
静态方法valueOf(String name) 返回指定名称(name指的是默认toString方法返回的值,即类型常量的名称)的枚举常量
ordinal() 返回指定枚举常量在枚举类型中声明的位置,位置从0开始哦
枚举类型中 每一个枚举常量都要实现,枚举类中的抽象方法,枚举常量就是一个静态变量。因此下面代码枚举类型常量需要放在自定义静态代码块之前
案例如下:
packagecom.effectJava.Chapter3;importjava.util.HashMap;importjava.util.Map;public enumOperation {
PLUS("+") {
@Overrideint apply(int a, intb) {return a +b;
}
}, MINUS("-") {
@Overrideint apply(int a, intb) {return a -b;
}
}, MULTI("*") {
@Overrideint apply(int a, intb) {return a *b;
}
}, DIVID("/") {
@Overrideint apply(int a, int b) {//测试代码没必要处理可能的异常
return a /b;
}
};//自定义的valueOf方法
private static final Mapmaps;static{
System.out.println("Initi Static Block");
maps= new HashMap<>();for(Operation operation : Operation.values()) {
maps.put(operation.symbol, operation);
}
}public staticOperation fromString(String symbol) {returnmaps.get(symbol);
}private finalString symbol;
Operation(String symbol) {
System.out.println(symbol);this.symbol =symbol;
}abstract int apply(int a, intb);//把symbol变为枚举常量的唯一标识后,
//最好定义一个fromString(String symbol)方法返回symbol唯一标识的枚举类型
public static voidmain(String... args) {
System.out.println(Operation.PLUS.apply(1, 2));//Operation.valueOf("ss");
System.out.println(Operation.fromString("+"));
}
}
java 程序初始化顺序
1.父类静态变量 2.父类静态代码块 3.子类静态变量 4.子类静态代码块 5.父类非静态变量 6.父类非静态代码块,7.父类构造器,8.子类非静态变量 9.子类非静态代码块 10.子类构造器
序列索引实现香草分类
packagecom.effectJava.Chapter3;importsun.misc.SharedSecrets;importjava.util.EnumMap;importjava.util.HashSet;importjava.util.Set;public classHerb {public enumType {ANNUAL, PERENNIAL, BIENNIAL,}private finalString name;private finalType type;
Herb(String name, Type type) {this.name =name;this.type =type;
}
@OverridepublicString toString() {returnname;
}//对植物进行分类
public static voidmain(String... args) {
Herb herbs[]= new Herb[]{new Herb("herb1", Type.PERENNIAL), new Herb("herb2", Type.ANNUAL), new Herb("herb3", Type.ANNUAL), new Herb("herb4", Type.BIENNIAL)};//1.通过枚举常量的位置序号来对植物的类别分类位置//构造类别数组
Set[] her = (Set[]) newSet[Type.values().length];for (int i = 0; i < her.length; i++) {
her[i]= new HashSet();
}//对植物进行分类
for(Herb herb : herbs) {
her[herb.type.ordinal()].add(herb);
}for (int i = 0; i < her.length; i++) {
System.out.printf("%s : %s%n", Herb.Type.values()[i], her[i]);
}
System.out.println(SharedSecrets.getJavaLangAccess().getEnumConstantsShared(Type.class));
//EnumMap分类 对每种香草分类,//2. 使用EnumMap来实现植物分类
System.out.println(" 使用EnumMap来实现植物分类");
EnumMap> typeSetEnumMap = new EnumMap<>(Type.class);for(Herb.Type t : Herb.Type.values()) {
typeSetEnumMap.put(t,new HashSet());
}for(Herb h : herbs) {
typeSetEnumMap.get(h.type).add(h);
}
System.out.println(typeSetEnumMap);
}
}
EnumMap状态转移两种实现
packagecom.effectJava.Chapter3;//转移关系
public enumPhase {
SOLID, LIQUID, GAS;public enumTransition {
MELT, FREEZE, BOIL, CONDENSE, SUBLIME, DEPOSIT;private static final Transition[][] transitions = {{null, MELT, SUBLIME}, {FREEZE, null, BOIL}, {DEPOSIT, CONDENSE, null}};public staticTransition from(Phase src, Phase dest) {returntransitions[src.ordinal()][dest.ordinal()];
}
}
}
优化之后的代码
packagecom.effectJava.Chapter3;importjava.util.EnumMap;importjava.util.Map;//通过 Map> 来表示转移关系
public enumPhaseModify {
SOLID,LIQUID,GAS;public enumTransition {
MELT(SOLID, LIQUID),
FREEZE(LIQUID, SOLID),
BOIL(LIQUID, GAS),
CONDENSE(GAS, LIQUID),
SUBLIME(SOLID, GAS),
DEPOSIT(GAS, SOLID);private finalPhaseModify src;private finalPhaseModify dst;
Transition(PhaseModify src, PhaseModify dst) {this.src =src;this.dst =dst;
}private static final Map> map = new EnumMap>(PhaseModify.class);static{for(PhaseModify p : PhaseModify.values()) {
map.put(p,new EnumMap(PhaseModify.class));
}for(Transition trans : Transition.values()) {
map.get(trans.src).put(trans.dst, trans);
}
}public staticTransition from(Phase src, Phase dst) {returnmap.get(src).get(dst);
}
}
}