2014-10-07 59 views
0

我有一個類,比如Test;在那裏是一個嵌套的靜態類,比如TestParams。只有確定變量是否在類中聲明

TestParams包含一些字符串變量指的是Test類

我現在面臨的問題是,在測試類的制定者,我需要驗證,如果設定的參數是聲明的則params的一個Params類。

public class Test { 

    protected String n; 
    protected int num; 

    public static class TestParams { 
    public static final String PARAM_N="n"; 
    public static final String PARAM_NUM="num"; 
    } 

    public void setParam(String key, Object value) { 
    // Need to check here the if key is defined in TestParams 
    // keep adding conditions to IF statement when more params added?? 
    if(key.equals(TestParams.PARAM_N) || (key.equals(TestParams.PARAM_NUM)) 
     // Do some stuff 
    } 

} 

是否有任何以取代多個條件IF語句的方法:

該方案將在下面的代碼所示? (類似如果TestParams()鍵或者一些其他的設計代碼結構

+0

你可以嘗試反射 – talex 2014-10-07 11:40:29

+0

做一個枚舉並使用'Enum.valueOf(String)!= null'? – 2014-10-07 11:41:07

+0

但是,使用所有可能的密鑰並使用'contains'方法只是有'Set '這不容易嗎? – talex 2014-10-07 11:41:38

回答

2

爲了解決你問的具體問題,我看比使用反射沒有其他辦法?

private boolean isValidKey(String str) { 
    for (Field f : TestParams.class.getFields()) 
     try { 
      if (f.get(null).equals(str)) 
       return true; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    return false; 
} 

雖然我會強烈建議您重新思考設計。

0

你可以把所有這些領域的地圖一樣

public class Test { 

    protected String n; 
    protected int num; 

    public static class TestParams { 
    public static Map<String, Object> PARAMS; 

    // This will initialize the map statically 
    static { 
     PARAMS.put("PARAM_N", "n"); 
     PARAMS.put("PARAM_NUM", "num"); 
    } 
    } 

    public void setParam(String key, Object value) { 
    for(Map.Entry<String, Object> entry : TestParams.PARAMS){ 
     if(entry.getValue().equals(key)){ 
     //do stuff 
     } 
    } 
    } 
} 
0

使用反射可能是一個解決辦法:

import java.lang.reflect.Field; 
import java.lang.reflect.Modifier; 
import java.util.HashMap; 
import java.util.Map; 


public class Test { 

    protected String n; 
    protected int num; 

    private Map<String,Object> params = new HashMap<String,Object>(); 

    public Test(){ 
     Field[] fields = TestParams.class.getDeclaredFields(); 
     for (Field field : fields) { 
      if (Modifier.isStatic(field.getModifiers())) { 
       try { 
       params.put(field.getName(), field.get(null)); 
      } catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 
      } 
     } 
    } 

    public static class TestParams { 
    public static final String PARAM_N="n"; 
    public static final String PARAM_NUM="num"; 
    } 

    public void setParam(String key, Object value) { 
     if(params.containsValue(key)){ 
      // do .... 
     }else{ 
      // do ... 
     } 
    } 

} 

1 - 你遍歷在TestParams

靜態變量

2 - 在您的測試類

3保存在map<paramName,ParamValue>這些變量 - 在你SetParam方法問你是否存在一個值

0

有這樣一種機制,BeanInfothis,它將一個簡單的POJO(bean)類與元信息關聯在一個單獨的類中。它現在的主要用法是提供兩列屬性窗口來編輯某些POJO類的字段。使用PropertyDescriptor

現在,BeanInfo需要一些工具,而且這一切都取決於您的用例。那裏的文檔從來沒有非常吸引人,涉及到Serializable等。但它提供的功能,你會很難重塑。

也許先嚐試一下JComponent,像字段驗證這樣的可能性仍然需要一些編碼。