我有一组实现特定接口的类,我有一组复选框。如果没有选中复选框,我想抛出一个错误。如果选择了至少一个或多个复选框,则应创建与该复选框关联的对象。
这就是我的工作方式。
interface U { ... }
class A implements U { ... }
class B implements U { ... }
class C implements U { ... }
class Main {
//....
//....
public void findSelectedCheckBoxesAndCreateObjects() {
if(!(checkboxA.isSelected() || checkboxB.isSelected() || checkboxC.isSelected()) {
System.out.println("No checkboxes selected");
return;
}
//if any selected, create associated object
if(checkboxA.isSelected()) new A(file);
if(checkboxB.isSelected()) new B(file);
if(checkboxC.isSelected()) new C(file);
}
}
现在我有3个问题。
|| checkboxD.isSelected()
。if(checkboxD.isSelected()) new D(file);
。非常不优雅。我可以使用某种循环来删除冗余代码吗?
请给我你的建议。 谢谢。
答案 0 :(得分:5)
您应该使用集合结构来保存复选框和相关类。 使用Map你可以做这样的事情:
Map <JCheckBox,Class<U>> uCheck = new HashMap<JCheckBox,Class<U>>(
);
//将复选框和U类添加到地图
uCheck.put(checkBoxA, A.class);
现在,根据复选框状态获取需要实例化的类的集合非常容易:
public Collection<Class<U>> getEnabledClasses(<JCheckBox,Class<U>> checkMap) {
List<Class<U>> result = new LinkedList<Class<U>>();
for (Map.Entry<JCheckBox,Class<U>> entry:checkMap.entrySet()) {
if (entry.getKey().isSelected()) {
result.add(entry.getValue());
}
}
}
现在,对getEnabledUs(uCheck)的调用将返回所选类的集合。如果集合是空的,则没有选择,因此无关。
for (Class<U> u:getEnabledClasses(...)) {
Constructor<U> cons = u.getConstructor(...);
U instance = cons.newInstance(fileparameter);
instance.doSomething(...);
}
这应该让你开始。 (*)免责声明:这是未经测试的代码。相反,伪代码只有在需要时才有清晰的细节。