2

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

我就是这样做的。

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 回答 1

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

那应该让你开始。(*) 免责声明:这是未经测试的代码。而是仅在需要时使用具有清晰细节的伪代码。

于 2011-08-26T16:04:46.530 回答