2015-10-09
8:33 PM
因為工作有機會接觸到 Google 的原始碼
就順便學到這個建構方式
可以說是既方便又結構化
最大的優點就是傳遞此類參數時可以用型態防呆
又可以在寫入資料庫時輕鬆轉換為數值
程式碼範例
public class ArticleType extends EnumBase { // 儲存參數 private static MapMAP = 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 staticList 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