org.springframework.core.enums類圖
這個包按照說明是: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);
}
}
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";
}
};
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;
}
//獲取某個類中聲明的枚舉類型,這些類型 //必須是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,類名已經顯示了它們的用途,不再細說。這個包完整的類圖如下:
文章轉自莊周夢蝶 ,原文發布時間5.17
最後更新:2017-05-17 13:35:14