如何实现对应于枚举在Java中的双功能作用?

问题描述 投票:8回答:2

我有Java enum

public enum ConflictResolutionStrategy {
    softResolve,
    hardResolve,
}

我想这样称呼它ConflictResolutionStrategy.hardResolve.apply(case1, case2)

无论case1和相同类型的case2对象。 apply在我的情况应该返回什么。

这种设计背后的基本理念。创建Strategy设计模式和解决基于一组enum价值冲突。

我找不到在计算器上任何类似的问题,甚至简单的搜索让我吨不直接解决我的情况类似的案件。

我试过如下:

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);
        }
    },
}

第二个解决方案,工作不错,但需要太多的代码。

java lambda enums java-8 functional-interface
2个回答
7
投票

函数接受两个参数并返回简直就是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 */ }); 

1
投票

也许你正在寻找类似的枚举作为内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){}
}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.