2014-10-07 61 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,像字段验证这样的可能性仍然需要一些编码。