Модуляция добавления новых строк -> вызовы методов

Если у меня есть программа, которая делает следующее:

if(input=='abc'){do x}
if(input=='def'){do y}

В будущем я, возможно, захочу добавить еще один фрагмент кода, например так:

if(input=='ghy'){do x}

Как вы можете видеть, я добавляю новый оператор "if" для другого условного НО, используя ту же функцию X. Код в будущем может иметь множество различных операторов IF (или переключателей), каждый из которых сравнивает строку с строка, а затем выполняет функцию. Учитывая будущее расширение, мне было интересно, есть ли возможный "аккуратный", "модульный" способ достижения тех же результатов.

Жаль, что я не могу объединить String с вызовом метода в хеш-таблице (String, метод) в Java. Таким образом, я мог бы просто сохранить любые новые процедуры внутри хеш-таблицы и получить соответствующий метод для этой строки.

Есть идеи?

Спасибо

РЕДАКТИРОВАТЬ: Спасибо за все решения. Я был удивлен количеством и качеством ответов, которые я получил за такое небольшое количество времени.

4 ответа

Может быть, вы можете использовать enum, Пример:

public enum InputType
{

    abc, def
    {
        @Override
        public void x()
        {
            System.out.println("Another method");
        }
    },
    ghy;

    public void x()
    {
        System.out.println("One method");
    }
}

И далее:

InputType.valueOf("abc").x();

Ура!

Я думаю, вы всегда можете использовать Map и сопоставить анонимным реализациям Runnable:

myMap.put("abc", new Runnable() { public void run() { do x } });

...

myMap.get(input).run();

Вы должны взглянуть на шаблон команды. Есть несколько способов его реализации, и фреймворки, такие как Spring, могут помочь вам сделать это простым способом.

Но простым способом вот что вы можете сделать:

1-Создайте интерфейс Command с методом, который ваша программа должна вызывать для выполнения задачи, скажем, doTask ()

2-Создать классы для команд X и Y, реализуя интерфейс Command.

3-Создать Map<String, Command> который отобразит ваши команды (X и Y) на логические имена

4. Создайте файл конфигурации по вашему выбору, например, файл.properties, который сопоставит ваш ввод с именами ваших команд: abc = X, def = Y, ghi = X

5. Затем ваша программа выполняет поиск в файле конфигурации, чтобы узнать, какую команду выполнить в соответствии с вводом.

Многие ifs всегда говорят нам, что мы могли бы сделать это лучше. В вашем случае лучше использовать шаблон проектирования, например, " Цепочка ответственности". У вас будет хорошая реализация, которую вы можете динамически изменять, и ваш код будет легче обслуживать, чем реализация ifs.

Взгляните на эту цепочку ответственности адаптации к вашему делу:

Главный:

public static void main(String[] args) {
    ClassA classA = new ClassA(Arrays.asList("abc", "ghi"));
    ClassB classB = new ClassB(Arrays.asList("def"));
    classA.setNextInChain(classB);  // you can always write Builder to do this
    String input = "def";
    classA.execute(input);
}

BaseClass:

public abstract class BaseClass {
    private Collection<String> patterns = Collections.EMPTY_LIST;
    protected BaseClass nextInChain;
    protected abstract void doMethod();  // your doA, doB methods

    public void execute(String input) {
            // this replace many ifs in your previous implementation
        if (patterns.contains(input)) {
            doMethod();
        } else {
            nextInChain.execute(input);
        }       
    }

    public void setPatterns(Collection<String> patterns) {
        this.patterns = patterns;
    }

    public void setNextInChain(BaseClass nextInChain) {
        this.nextInChain = nextInChain;
    }
}

Класс в цепочке:

public class ClassA extends BaseClass {
    ClassA(Collection<String> patterns) {
        setPatterns(patterns);
    }
    @Override
    protected void doMethod() {
        // do A     
    }
}

public class ClassB extends BaseClass {...}
Другие вопросы по тегам