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

Vig*_*ran 2 java code-reuse swing coding-style 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我有3个问题.

  1. 这只是一个示例代码.Original有8个复选框和更多的类.
  2. || checkboxD.isSelected()每次我有一个新类来检查它时,我都不能继续添加.
  3. 一样.我不能继续if(checkboxD.isSelected()) new D(file);为每节课增加.

它非常不优雅.我可以使用某种循环来删除冗余代码吗?

请给我你的建议.谢谢.

maa*_*asg 5

您应该使用集合结构来保存您的复选框和那些相关的类.使用Map你可以做这样的事情:

Map <JCheckBox,Class<U>> uCheck = new HashMap<JCheckBox,Class<U>>();

//将复选框和U类添加到地图中

uCheck.put(checkBoxA, A.class);
Run Code Online (Sandbox Code Playgroud)

现在,根据复选框状态获取需要实例化的类的集合非常容易:

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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,对getEnabledUs(uCheck)的调用返回所选类的集合.如果集合是空的,则没有选择,因此无关.

for (Class<U> u:getEnabledClasses(...)) {
    Constructor<U> cons = u.getConstructor(...);
    U instance = cons.newInstance(fileparameter);
    instance.doSomething(...);
}
Run Code Online (Sandbox Code Playgroud)

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