Java8:在一个对象上应用方法列表
我在代码中有一个特殊的部分,我想做的就是下面的内容,但是我无法以一种不涉及代码重复的方式编写代码。是否有一种方法可以声明方法列表,然后将其应用于Java8:在一个对象上应用方法列表,java,java-8,Java,Java 8,我在代码中有一个特殊的部分,我想做的就是下面的内容,但是我无法以一种不涉及代码重复的方式编写代码。是否有一种方法可以声明方法列表,然后将其应用于productFeatureValidationDto。我目前的做法是不切实际的 public ValidateProductFeatureResponse validateProductFeatureAgainstAllCriteria(ProductFeatureValidationDto productFeatureValidationDto) t
productFeatureValidationDto
。我目前的做法是不切实际的
public ValidateProductFeatureResponse validateProductFeatureAgainstAllCriteria(ProductFeatureValidationDto productFeatureValidationDto) throws
ApplicationException, ParseException {
ValidateProductFeatureResponse response;
response = this.validateProductFeatureA(productFeatureValidationDto);
if(response.getStatus().equalsIgnoreCase(ResponseStatus.FAILURE.name())){
return response;
}
response = this.validateProductFeatureB(productFeatureValidationDto);
if(response.getStatus().equalsIgnoreCase(ResponseStatus.FAILURE.name())){
return response;
}
response = this.validateProductFeatureA(productFeatureValidationDto);
if(response.getStatus().equalsIgnoreCase(MPResponseStatus.FAILURE.name())){
return response;
}
response = this.validateProductFeatureC(productFeatureValidationDto);
if(response.getStatus().equalsIgnoreCase(MPResponseStatus.FAILURE.name())){
return response;
}
response = this.validateProductFeatureD(productFeatureValidationDto);
if(response.getStatus().equalsIgnoreCase(ResponseStatus.FAILURE.name())){
return response;
}
response = this.validateProductFeatureE(productFeatureValidationDto);
if(response.getStatus().equalsIgnoreCase(ResponseStatus.FAILURE.name())){
return response;
}
response = this.validateProductFeatureF(productFeatureValidationDto);
if(response.getStatus().equalsIgnoreCase(ResponseStatus.FAILURE.name())){
return response;
}
return getResponseOnValidationSuccess(productFeatureValidationDto);
}
提前感谢。如果您可以使用spring框架。
首先,您可以定义这样的接口
公共接口验证产品{
ValidateProductFeatureResponse validate(ProductFeatureValidationDto);
}
您的特定验证类实现此接口并注册到srpingcontext
public ValidateProductFeatureResponse validateProductFeatureAgainstAllCriteria(ProductFeatureValidationDto到ProductFeatureValidationDto)抛出
ApplicationException,ParseException{
验证ProductFeatureResponse响应;
Map beansOfType=applicationContext.getBeansOfType(ValidateProduct.class);
for(ValidateProduct值:beansOfType.values()){
响应=value.validate(productFeatureValidationDto);
if(response.getStatus().equalsIgnoreCase(ResponseStatus.FAILURE.name()){
返回响应;
}
}
返回getResponseOnValidationSuccess(productFeatureValidationDto);
}
我建议采用以下方法(示意图):
/**
*验证函数列表
*/
私有最终静态列表验证=新建LinkedList();
/**
*填写验证列表
*/
静止的{
验证。添加((源)->{
//特性A的测试
返回源;
});
验证。添加((源)->{
//特性B的测试
返回源;
});
验证。添加((源)->{
//特性C的测试
返回源;
});
}
/**
*失效判定谓词
*/
私有最终谓词是_FAILURE=(dto)->
dto.getStatus().equalsIgnoreCase(ResponseStatus.FAILURE.name());
/**
*验证方法
*/
公共ValidateProductFeatureResponse validateProductFeatureAgainstAllCriteria(
ProductFeatureValidationDto到dto
)引发ApplicationException,ParseException{
//迭代验证函数并在dto实例上调用它们
//按失败的验证筛选流
//第一场比赛就停下来
可选的dtoOptional=VALIDATIONS.stream()
.map(操作->操作.apply(dto))
.过滤器(IS_故障)
.findFirst();
//根据结果应用fuilure/success映射
返回dtoOptional.isPresent()
?getResponseOnValidationFailure(dto)
:getResponseOnValidationSuccess(dto);
}
我最终根据@Eiden和@Alexandra Dudkina给出的答案编写了我的解决方案。对他们大喊一声。下面是我整个解决方案的关键
所以,我有两个接口
ipProductFeature
:这是一个功能界面,只有一种方法验证
。每个约束都需要实现这一点ipProductValidationService
:这是一份合同,规定了需要实现的核心方法。方法验证ProductFeatureAgaInstallCriteria
是合同的一部分ipProductValidationService
的具体类从配置中获取列表,然后将列表中的所有约束应用于给定的dto。
通过这种方式,我将所有关注点分为不同的部分。
这种方法的实际优势是:
- 您可以为各个特性编写广泛的测试用例和文档
- 如果将来,
中有策略更改(例如),我所要做的就是创建一个新的具体类,将其命名为ProductFeatureBV2并仅更改配置文件。策略更改可以作为类javadoc的一部分进行记录。这样,在不改变核心验证方法的情况下,我可以不推荐ProductFeatureB
。这使得代码非常灵活ProductFeatureB
非常感谢社区帮助我做到这一点。如果这里有进一步的改进,请提出建议。使用interface@deadshot,我对功能界面不是很熟悉。你能为我提供一个小线索吗?这会有很大帮助,这很有意义,但当这些方法永远不会在方法之外使用时,似乎做得太多了#validateProductFeatureAgainstAllCriteria。这看起来像我正在寻找的方法。非常感谢。
/**
* List of validation functions
*/
private final static List<Function<ProductFeatureValidationDto, ProductFeatureValidationDto>> VALIDATIONS = new LinkedList<>();
/**
* Fill validations list
*/
static {
VALIDATIONS.add((source) -> {
// test for feature A
return source;
});
VALIDATIONS.add((source) -> {
// test for feature B
return source;
});
VALIDATIONS.add((source) -> {
// test for feature C
return source;
});
}
/**
* Predicate for failure determination
*/
private final Predicate<ProductFeatureValidationDto> IS_FAILURE = (dto) ->
dto.getStatus().equalsIgnoreCase(ResponseStatus.FAILURE.name());
/**
* Validation method
*/
public ValidateProductFeatureResponse validateProductFeatureAgainstAllCriteria(
ProductFeatureValidationDto dto
) throws ApplicationException, ParseException {
// iterate over validation functions and invoke them on dto instance
// filter stream by failed validations
// stop on first match
Optional<ProductFeatureValidationDto> dtoOptional = VALIDATIONS.stream()
.map(action -> action.apply(dto))
.filter(IS_FAILURE)
.findFirst();
// apply fuilure / success maping depending on result
return dtoOptional.isPresent()
? getResponseOnValidationFailure(dto)
: getResponseOnValidationSuccess(dto);
}