我上课了,说测试;其中是一个嵌套的静态类,比如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()中的键或者代码结构可能还有其他一些设计?
答案 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)
有一种机制BeanInfo或this,它将一个简单的POJO(bean)类与元信息关联在一个单独的类中。它现在的主要用途是提供两列属性窗口来编辑某些POJO类的字段。使用PropertyDescriptor。
现在,BeanInfo需要一些工具,这一切都取决于你的用例。那里的文档从未如此吸引人,触及Serializable等。但它提供了功能,你很难重新发明。
也许首先尝试使用JComponent,像字段验证这样的可能性仍需要一些编码。