2

特定のインターフェイスを実装する一連のクラスがあり、一連のチェックボックスがあります。チェックボックスが選択されていない場合にエラーをスローしたい。少なくとも 1 つ以上のチェックボックスが選択されている場合、そのチェックボックスに関連付けられたオブジェクトを作成する必要があります。

これが私がやった方法です。

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. これは単なるサンプル コードです。オリジナルには 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 に答える