如何避免使用Java中的JCheckBoxes进行冗余编码

时间:2011-08-26 15:25:03

标签: java swing coding-style code-reuse jcheckbox

我有一组实现特定接口的类,我有一组复选框。如果没有选中复选框,我想抛出一个错误。如果选择了至少一个或多个复选框,则应创建与该复选框关联的对象。

这就是我的工作方式。

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个问题。

  1. 这只是一个示例代码。 Original有8个复选框和更多的类。
  2. 每次有新课程检查时,我都无法继续添加|| checkboxD.isSelected()
  3. 同样的事情。我不能继续为每个班级添加if(checkboxD.isSelected()) new D(file);
  4. 非常不优雅。我可以使用某种循环来删除冗余代码吗?

    请给我你的建议。 谢谢。

1 个答案:

答案 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(...);
}

这应该让你开始。 (*)免责声明:这是未经测试的代码。相反,伪代码只有在需要时才有清晰的细节。