第三十条:用enum代替int常量
enum的简单用法。
enum Operation { PLUS("+") { double apply(double x, double y) { return x + y; } }, MINUS("-") { double apply(double x, double y) { return x - y; } }; private final String symbol; private Operation(String symbol) { this.symbol = symbol; } @Override public String toString() { return symbol.toString(); } abstract double apply(double x, double y); }
第三十一条:用实例域代替序数
就是向上面那样将symbol换成一个int类型的值用于标记实例。
第三十二条:用EnumSet代替位域(没用过位域,还不太懂)
第三十三条:用EnumSet代替序数索引
就是告诉别用ordinal()方法,这个基本上对于程序来说没有用。不要将ordernal的方法的返回值作为索引。
EnumMap的用法
public enum Phase { SOLID, LIQUID, GAS; public enum Transition { MELT(SOLID, LIQUID), FREEZE(LIQUID, SOLID), BOIL(LIQUID, GAS), CONDENSE(GAS, LIQUID); private final Phase src; private final Phase des; private Transition(Phase src, Phase des) { this.src = src; this.des = des; } private static final Map<Phase, Map<Phase, Transition>> MAP = new EnumMap<Phase, Map<Phase, Transition>>(Phase.class); static { for (Phase phase : Phase.values()) MAP.put(phase, new EnumMap<Phase, Transition>(Phase.class)); for (Transition transition : Transition.values()) { MAP.get(transition.src).put(transition.des, transition); } } } }
和其他类型的map差不多,就是最后需要加上Key.class。
第三十四条:用接口模拟可伸缩的枚举
枚举间不可继承,但是枚举可实现接口。
第三十五条:注解优于命名格式
第三十六条:坚持使用Override注解
第三十七条:用标记接口定义类型