2015-10-09
8:33 PM
因為工作有機會接觸到 Google 的原始碼
就順便學到這個建構方式
可以說是既方便又結構化
最大的優點就是傳遞此類參數時可以用型態防呆
又可以在寫入資料庫時輕鬆轉換為數值
程式碼範例
public class ArticleType extends EnumBase {
// 儲存參數
private static Map MAP = new LinkedHashMap<>();
// 建立參數
private static final String _NORMAL = "normal";
private static final String _ALWAYS_TOP = "always_top";
private static final String _DELETED = "deleted";
// 建立參數物件
public static final ArticleType NORMAL = new ArticleType(_NORMAL);
public static final ArticleType ALWAYS_TOP = new ArticleType(_ALWAYS_TOP);
public static final ArticleType DELETED = new ArticleType(_DELETED);
protected ArticleType(String value) {
super(value);
}
// 取得所有參數物件
public static List enums() throws IllegalArgumentException, IllegalAccessException{
return enums(ArticleType.class);
}
// 利用參數值取出物件
public static ArticleType fromValue(String value){
return MAP.get(value);
}
// 取得 Map 物件
@SuppressWarnings("unchecked")
@Override
protected Map getMap() {
return (Map) MAP;
}
// 取得參數名稱
public String getName(){
switch( this.getValue() ){
case _NORMAL:
return "一般文章";
case _ALWAYS_TOP:
return "置頂文章";
case _DELETED:
return "已刪除文章";
default:
return "無此類型";
}
}
}
以下是父類別的程式碼
public abstract class EnumBase {
protected String value;
// 創建時順便放入 Map 中
protected EnumBase(String value) {
super();
this.value = value;
this.setMap(value);
}
// 取得所有參數物件
protected static List enums(Class clazz)
throws IllegalArgumentException, IllegalAccessException{
List list = new ArrayList();
Field[] fields = clazz.getFields();
for( Field field : fields ){
if( field.getType() == clazz ){
@SuppressWarnings("unchecked")
T target = (T) field.get(clazz);
list.add(target);
}
}
return list;
}
// 將參數放入 Map 中
public void setMap(String value){
this.getMap().put(value, this);
}
// 取得參數值
public String getValue(){
return value;
}
public String toString(){
return this.getValue();
}
// 取得參數名稱
public abstract String getName();
// 取得 Map
protected abstract Map getMap();
}
各項資料連結
Google
No comments:
Post a Comment