Search

Java - Google 也愛用的參數列舉方式

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