2014.3.6 Java 枚举

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. 通过二维数组实现分发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值