java.lang.Enum
* 创建enum时,编译器会自动生成一个从java.lang.Enum类继承的类;
关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。
* enum的values方法返回enum实例的数组,是由编译器添加的static方法;Enum类中,没有values()方法;
* enum实例的ordinal()方法,返回该实例在声明时的次序;
* getDeclaringClass(),返回所属的enum类;
* name(),返回常量名;
* static Enums.valueOf(),返回名为s的枚举常量,没有的话,返回IllegalArgumentException;
* enum中如果需要自定义方法,需在常量定义之后加分号;
* 只能在enum定义的内部使用其构造器创建enum实例;
* enum实例后面括号内接的内容为要传递给enum的信息;
* Class.getEnumConstants(),非枚举类会返回null,若使用的话NullPointerException,getClass.getEnumConstants();
* T是一个enum实例
<T extends Enum<T>>
使用接口组织枚举:将枚举元素分类组织
public enum Course {
APPETIZER(Food.Appetizer.class),
MAINCOURSE(Food.MainCourse.class),
DESSERT(Food.Dessert.class),
COFFEE(Food.Coffee.class);
private Food[] values;
private Course(Class<? extends Food> kind) {
values = kind.getEnumConstants();
}
public Food randomSelection() {
return Enums.random(values);
}
} ///:~
* 利用接口建立起一个公共类型;
EnumSet:
* Java SE5引入EnumSet是为了通过enum创建一种替代品,以替代传统的基于int的位标志。可以用来表示某种开关信息;
* 在说明一个二进制位是否存在时,具有更好的表达能力并且无需担心性能;
* 使用,先创建一组包含全部状态位的enum,加入EnumSet代表状态位1;
EnumMap:
* EnumSet和EnumMap一样,enum实例定义时的次序决定了其在EnumMap中的顺序;
* EnumMap vs 常量相关的方法:EnumMap允许程序员改变值的对象,而常量相关的方法在编译期就被固定了;
常量相关的方法:
* 首先为enum定义一个或多个abstract方法,然后为每个enum实例实现该抽象方法;
* 每个enum实例都是enum类型的static final实例;
职责链:
Java 多路分发:
1.
class Paper implements Item {
public Outcome compete(Item it) { return it.eval(this); }
public Outcome eval(Paper p) { return DRAW; }
public Outcome eval(Scissors s) { return WIN; }
public Outcome eval(Rock r) { return LOSE; }
public String toString() { return "Paper"; }
}
2. 通过构造器来初始化enum实例实现分发
PAPER(DRAW, LOSE, WIN),
SCISSORS(WIN, DRAW, LOSE),
ROCK(LOSE, WIN, DRAW);
private Outcome vPAPER, vSCISSORS, vROCK;
RoShamBo2(Outcome paper,Outcome scissors,Outcome rock) {
this.vPAPER = paper;
this.vSCISSORS = scissors;
this.vROCK = rock;
}
public Outcome compete(RoShamBo2 it) {
switch(it) {
default:
case PAPER: return vPAPER;
case SCISSORS: return vSCISSORS;
case ROCK: return vROCK;
}
}
3. 通过常量相关方法实现分发
public enum RoShamBo3 implements Competitor<RoShamBo3> {
PAPER {
public Outcome compete(RoShamBo3 it) {
switch(it) {
default: // To placate the compiler
case PAPER: return DRAW;
case SCISSORS: return LOSE;
case ROCK: return WIN;
}
}
},
SCISSORS {
public Outcome compete(RoShamBo3 it) {
switch(it) {
default:
case PAPER: return WIN;
case SCISSORS: return DRAW;
case ROCK: return LOSE;
}
}
},
ROCK {
public Outcome compete(RoShamBo3 it) {
switch(it) {
default:
case PAPER: return LOSE;
case SCISSORS: return WIN;
case ROCK: return DRAW;
}
}
};
public abstract Outcome compete(RoShamBo3 it);
}
4. 通过EnumMap实现分发
5. 通过二维数组实现分发