确定是否在类中声明了变量

时间:2014-10-07 11:39:04

标签: java

我上课了,说测试;其中是一个嵌套的静态类,比如TestParams。

TestParams只包含一些引用Test类的String变量

我面临的问题是,在Test类的setter中,我需要验证set参数是否是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()中的键或者代码结构可能还有其他一些设计?

4 个答案:

答案 0 :(得分: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;
}

虽然我强烈建议您重新考虑设计。

答案 1 :(得分: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
      }
    }
  }
}

答案 2 :(得分: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 - 将这些变量保存在测试类的map<paramName,ParamValue>

3 - 在您的SetParam方法中,您询问地图中是否存在值

答案 3 :(得分:0)

有一种机制BeanInfothis,它将一个简单的POJO(bean)类与元信息关联在一个单独的类中。它现在的主要用途是提供两列属性窗口来编辑某些POJO类的字段。使用PropertyDescriptor

现在,BeanInfo需要一些工具,这一切都取决于你的用例。那里的文档从未如此吸引人,触及Serializable等。但它提供了功能,你很难重新发明。

也许首先尝试使用JComponent,像字段验证这样的可能性仍需要一些编码。