Как реализовать бифункциональную функцию, соответствующую Enum в Java? - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть Java enum:

public enum ConflictResolutionStrategy {
    softResolve,
    hardResolve,
}

Я хочу назвать его как ConflictResolutionStrategy.hardResolve.apply(case1, case2).

Оба case1 и case2 объекты одного типа,apply в моем случае ничего не должно возвращать.

Основная идея этого дизайна.Создание Strategy шаблона проектирования и разрешение конфликтов на основе заданного значения enum.

Я не могу найти подобные вопросы в StackOveflow, даже простой поиск дает мне массу похожих случаев, которые не решают моинепосредственно.

Я попробовал следующее:

public enum ConflictResolutionStrategy {
    softResolve ((CaseType case1, CaseType case2) -> case1.update(case2)),
    hardResolve,
}

Данная версия не компилируется.

Я попробовал другое решение:

public enum ConflictResolutionStrategy {
    softResolve,
    hardResolve {
        public void apply(CaseType case1, CaseType case2) {
            case1.update(case2);
        }
    },
}

Второе решение, работает нормально, но требует слишком много кода.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Функция, принимающая два параметра и ничего не возвращающая, является BiConsumer.

Ваше перечисление может реализовать BiConsumer:

public enum ConflictResolutionStrategy implements BiConsumer<CaseType, CaseType> {
    softResolve ((case1, case2) -> case1.update(case2)),
    hardResolve((case1, case2) -> {/* do something else */});

    private final BiConsumer<CaseType, CaseType> consumer;

    ConflictResolutionStrategy(BiConsumer<CaseType, CaseType> consumer){
        this.consumer = consumer;
    }

    @Override
    public void accept(CaseType case1, CaseType case2) {
        consumer.accept(case1, case2);
    }

}

Предположим, у вас есть метод для обработки ваших дел:

public void processCases(Collection<CaseType> cases, BiConsumer<CaseType, CaseType> conflictResolutionStrategy){
    // ...
}

Теперь вы можете передатьлибо одна из ваших существующих стратегий:

processCases(cases, ConflictResolutionStrategy.softResolve);

или встроенная стратегия:

processCases(cases, (c1, c2) -> { /* do smth here */ }); 
0 голосов
/ 05 февраля 2019

Может быть, вы ищете что-то вроде BiConsumer в перечислении как:

public enum ConflictResolutionStrategy {
    softResolve(CaseType::update), // just for example
    hardResolve((caseType, caseType2) -> {
        caseType.update(caseType2);
    }); // lambda representation

    BiConsumer<CaseType, CaseType> caseTypeBiConsumer;

    ConflictResolutionStrategy(BiConsumer<CaseType, CaseType> caseTypeBiConsumer) {
        this.caseTypeBiConsumer = caseTypeBiConsumer;
    }
}


class CaseType {
    void update(CaseType caseType){}
}
...