Effective java -- 5 枚举和注解

第三十条:用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注解

第三十七条:用标记接口定义类型

原文地址:https://www.cnblogs.com/badboyf/p/6291163.html