java - 如何避免工厂模式中的 Java 泛型警告

标签 java generics design-patterns rule-engine

我想实现通用 validator 来验证我的服务层中的业务规则,使用工厂设计模式并添加一些类似规则引擎的规则链。我有可行的解决方案,但我不确定这是否是最好的方法。

这是我的问题:我想确保编译时的类型安全,而不是在运行时拥有/检查类类型。因此,这将使开发人员安全地使用方法,而不会出现 ClassCastException 的机会。这是我想要解决的最后一个警告,但到目前为止还无法解决,我需要一些帮助并寻求建议如果我的设计中有些内容不清楚:

Unchecked call to 'validate(T)' as a member of raw type '...Validator'

我收到警告的行:

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

这是 validator 界面

public interface Validator<T extends Validatable> {

    /**
     * Validates each validation rules
     */
    void validate(T objectsToValidate);

}

这里是Validator接口(interface)的具体实现。这在其实现中调用验证规则

@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) 接口(interface),因为每个 ValidationRule 可能会获得不同的参数。我不想通过从接口(interface)获取参数来使其变得更加复杂,但也欢迎任何建议。

@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内部,您应该在Validator上定义HAS-A关系,而不是在其具体实现上。

     public class AssignedSelectionValidatorFactory implements ValidatorFactory {
         private Validator<T> validator;
.......

当您创建工厂对象时,您需要为 T 传递一个有效类型,在您的情况下为 AssignedSelectionValidatable

希望这能解决您的问题。

关于java - 如何避免工厂模式中的 Java 泛型警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54274329/

相关文章:

java - 为什么 JComboBox 上的 getSelectedItem() 不是通用的?

generics - Java 8通配符类型不能直接实例化

python - 模块中函数的条件定义

design-patterns - MVP Passive View 和 Supervising Controller 的集合实现差异

javascript - JavaScript 是否与严格的页面对象模式兼容?

java - handleWindowVisibility : no activity for token android. os.BinderProxy

java - 在 SD 卡上组织数据以便快速搜索的最佳方式

C# Generic Constraint - 如何引用当前类类型?

c - 如何避免在 C 中使用 global 来检测变量的设置?

java - 静态上下文中的外部类