枚举enum示例 :
public enum Apple{ FUJI(1), PIPPIN(2), GRANNY_SMITH(3); private int category; Apple(int category) { this.category = category; } } public enum Orange{NAVEL, TEMPLE, BLOOD}枚举本质上是int值
枚举类型为类型安全的枚举模式
策略枚举 : 利用抽象方法, 避免switch过于复杂,冗余
public enum PayrollDay { MONDAY(PayType.WEEKDAY), TUESDAY(PayType.WEEKDAY), WEDNESDAY(PayType.WEEKDAY), THURSDAY(PayType.WEEKDAY), FRIDAY(PayType.WEEKDAY), SATURDAY(PayType.WEEKEND), SUNDAY(PayType.WEEKEND); private final PayType payType; PayrollDay(PayType payType) { this.payType = payType; } double pay(double hoursWorked, double payRate) { return payType.pay(hoursWorked, payRate); } private enum PayType { WEEKDAY { @Override double overtimePay(double hours, double payRate) { return hours <= HOURS_PER_SHIT ? 0 : (hours - HOURS_PER_SHIT) * payRate / 2; } }, WEEKEND { @Override double overtimePay(double hours, double payRate) { return hours * payRate / 2; } }; private static final int HOURS_PER_SHIT = 8; abstract double overtimePay(double hours, double payRate); double pay(double hoursWorked, double payRate) { double basePay = hoursWorked + payRate; return basePay + overtimePay(hoursWorked, payRate); } } }通过Retention和Target注解进行注解, 被称为元注解(meta-annotation)
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Test { }