我有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);
}
},
}
第二个解决方案,工作不错,但需要太多的代码。
函数接受两个参数并返回简直就是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 */ });
也许你正在寻找类似的枚举作为内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){}
}