java - 如何避免工厂模式中的 Java 泛型警告
问题描述
我想实现通用验证器来验证我的服务层中的业务规则,使用工厂设计模式并添加一些规则链,如规则引擎。我有可行的解决方案,我不确定这是否是最好的方法。
这是我的问题:我想确保编译时的类型安全,而不是在运行时拥有/检查类类型。因此,它将使开发人员可以安全地使用方法,而不会出现 ClassCastException。这是我想解决但到目前为止无法解决的最后一个警告,我需要一些帮助并接受建议如果我的设计中有一些不清楚的地方:
作为原始类型 '...Validator' 的成员对 'validate(T)' 的未经检查的调用
我收到警告的行:
Validator validator = assignedSelectionValidatorFactory.createValidator(ValidationMode.SAVE);
validator.validate(new AssignedSelectionValidatable(assignSelectionRequestDto));
这是我的工厂界面
public interface ValidatorFactory {
/**
* Creates factory which returns {@link Validator} based on the {@link ValidationMode}
*/
Validator createValidator(ValidationMode validationMode);
}
这是我对工厂的具体实现
@Component
public class AssignedSelectionValidatorFactory implements ValidatorFactory {
private AssignedSelectionSaveValidator assignedSelectionSaveValidator;
public AssignedSelectionValidatorFactory(AssignedSelectionSaveValidator assignedSelectionSaveValidator) {
this.assignedSelectionSaveValidator = assignedSelectionSaveValidator;
}
@Override
public Validator createValidator(ValidationMode validationMode) {
switch (validationMode) {
case SAVE:
return assignedSelectionSaveValidator;
default:
return null;
}
}
}
这是验证器接口
public interface Validator<T extends Validatable> {
/**
* Validates each validation rules
*/
void validate(T objectsToValidate);
}
下面是Validator接口的具体实现。这在其实现中调用验证规则
@Component
public class AssignedSelectionSaveValidator implements Validator<AssignedSelectionValidatable> {
private AssignedSelectionUniqueRule assignedSelectionUniqueRule;
AssignedSelectionSaveValidator(AssignedSelectionUniqueRule assignedSelectionUniqueRule) {
this.assignedSelectionUniqueRule = assignedSelectionUniqueRule;
}
@Override
public void validate(AssignedSelectionValidatable assignedSelectionValidatable) {
assignedSelectionUniqueRule.apply(assignedSelectionValidatable.getAssignSelectionRequestDto());
}
}
这是验证规则。每个验证规则都是独立的,因此它们是可重用的。我也不能让他们实现一些 ValidationRule -> apply(T genericInterface) 接口,因为每个 ValidationRule 可能会得到不同的参数。而且我不想通过从界面获取参数来使其更复杂,但也愿意接受任何建议。
@Component
public class AssignedSelectionUniqueRule {
private AssignedSelectionRepository assignedSelectionRepository;
public AssignedSelectionUniqueRule(AssignedSelectionRepository assignedSelectionRepository) {
this.assignedSelectionRepository = assignedSelectionRepository;
}
public void apply(AssignSelectionRequestDto objectToValidate) {
Optional<AssignedSelection> foundAssignedSelection =
assignedSelectionRepository.getBy(objectToValidate.getSelectionDto().getId(),
objectToValidate.getCampaignUuid());
if (foundAssignedSelection.isPresent()) {
throw new BadRequestException(
"AssignedSelection is already exists with campaignUuid: {} and selectionUuid: {}");
}
}
}
解决方案
首先,在 内部AssignedSelectionValidatorFactory
,您应该在 上定义 HAS-A 关系Validator
,而不是在其具体实现上。
public class AssignedSelectionValidatorFactory implements ValidatorFactory {
private Validator<T> validator;
.......
创建工厂对象时,您需要为 T 传递一个有效类型,在您的情况下是AssignedSelectionValidatable
我希望这能解决你的问题。
推荐阅读
- python - 如何修复 int 在 python 中不可迭代?
- node.js - 在 Mac 上设置默认节点版本
- css - 为什么我的按钮无法在 localhost.3000 上呈现?
- c++ - MFC 如何更改 CLinkCtrl 的链接文本颜色?
- vue.js - 为 v-model 使用参数名称
- python - 为什么在使用 pyperclip 时只复制一条语句
- python - 从 Informatica Cloud 运行 Python 脚本
- unicode - 将多字节数组转换为 Unicode
- flutter - 我怎样才能在颤振上画出这个弯曲的抽屉?
- sql - PLSQL 在发布者表中添加新发布者,然后将其添加到发布者值为空的图书表中并以给定格式显示