关于oop:使用Java预防instanceof和cast

Preventing instanceof and casting in Java

本问题已经有最佳答案,请猛点这里访问。

如果我想在方法签名不同的地方使用不同的验证器,如何避免在这种情况下使用instanceof和强制转换?

代码

1
2
3
4
5
6
7
8
9
10
11
for(BatchValidator validator : validators) {
  try {    
    if (validator instanceof BatchErrorValidator) {
      ((BatchErrorValidator<T>) validator).validate(targets);
    } else if (validator instanceof BatchWarningValidator) {
      ((BatchWarningValidator<T>) validator).validate(targets, header);
    }
  } catch (BatchValidationException e) {
    handleImportExceptions(e, header.getSequenceId());
  }
}


为什么不让BatchValidator.validate()取2个参数:目标和标题。各个实现可以决定它们需要使用哪个参数。

这样,调用循环只向每个验证器传递相同的参数,而不需要instanceof或任何强制转换。