Как избежать избыточного кодирования с JCheckBoxes в Java - PullRequest
2 голосов
/ 26 августа 2011

У меня есть набор классов, которые реализуют определенный интерфейс, и у меня есть набор флажков.Я хочу выдать ошибку, если флажки не установлены.Если выбран хотя бы один или несколько флажков, он должен создавать объекты, связанные с этим флажком.

Вот как я это сделал.

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); для каждого класса.

Это очень не элегантно.Могу ли я иметь какой-то цикл, который удаляет избыточный код?

Пожалуйста, дайте мне ваши предложения.Спасибо.

1 Ответ

5 голосов
/ 26 августа 2011

Вы должны использовать структуру коллекции для хранения ваших флажков и связанных классов. Используя карту, вы можете сделать что-то вроде этого:

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

Это должно начать вас. (*) Отказ от ответственности: это не проверенный код. Скорее псевдокод с четкими деталями только там, где это необходимо.

...