Posted on 2007-04-11 15:57
dennis 閱讀(1698)
評論(0) 編輯 收藏 所屬分類:
java 、
源碼解讀
這個包按照說明是:Interfaces and classes for type-safe enum support on JDK >= 1.3。提供類型安全的枚舉類型。代碼也是相當簡單,枚舉類型又分為靜態類型和通用類型。靜態類型其實跟jdk1.5引進的enum類型類似,都是以int類型做code,比如聲明一個Dog類型:
public static class Dog extends StaticLabeledEnum {
private Dog(int code, String name) {
super(code, name);
}
}
然后就可以這樣聲明枚舉類型了:
public static final Dog BORDER_COLLIE = new Dog(13, "Border Collie");
public static final Dog WHIPPET = new Dog(14, "Whippet");
public static final Dog GOLDEN_RETRIEVER = new Dog(11, null) {
// must set type to be recognized as a "Dog"
public Class getType() {
return Dog.class;
}
public String getLabel() {
return "Golden Retriever";
}
};
同時有一個靜態枚舉類型的處理類用于提取信息:StaticLabeledEnumResolver
——這個類繼承自抽象類AbstractCachingLabeledEnumResolver,而抽象類實現了接口LabeledEnumResovler,看看這個接口就知道所謂處理類是干什么的了:
public interface LabeledEnumResolver {
//獲取某個類中聲明的枚舉類型,這些類型 //必須是LabeledEnum的子類
public Set getLabeledEnumSet(Class type) throws IllegalArgumentException;
public Map getLabeledEnumMap(Class type) throws IllegalArgumentException;
//根據code獲取枚舉
public LabeledEnum getLabeledEnumByCode(Class type, Comparable code) throws IllegalArgumentException;
//根據lable獲取枚舉
public LabeledEnum getLabeledEnumByLabel(Class type, String label) throws IllegalArgumentException;
}
StaticLabeledEnumResolver
使用了單例模式,同時AbstractCachingLabeledEnumResolver定義了一個模板法方法并使用:
protected abstract Set findLabeledEnums(Class type);
也是一個Template Method模式應用的例子。
所謂通用性的枚舉類型,是指不定義成static,并且可以靈活使用其他類型做code的枚舉,比如spring已經內置的3種:ShortCodedLabeledEnum
,StringCodeLabeledEnum和LetterCodeLabeledEnum,這些類都繼承自AbstractLabeledEnum,類名已經顯示了它們的用途,不再細說。這個包完整的類圖如下: