如何避免代码重复在子类中进行输入验证

How to avoid code duplication doing input validation in subclass

我有一个抽象基础 class,看起来像这样:

public abstract class AbstractConfig {

     public String someMethod(List<Params> params) {
         if (inputValidationFails()) { /* sanity check of params */
             return null;
         }
         return something;
     }
}

我有子class执行相同的输入验证。

public class CustomConfig extends AbstractConfig {
     @Override 
     public String someMethod(List<Params> params) {
         if (inputValidationFails()) { /*same input validation code*/
             return null;
         }

         return somethingElse; 
     }
}

我如何避免必须在基础 class 以及每个子 class 中实施此输入验证? 在AbstractConfig 中实现[非私有] 辅助方法inputValidationFails() 并在基础class 和每个子class 中调用它似乎不是特别好或干净。

我建议您将您的方法拆分为两个单独的方法,一个 public 您在基 class 中实现的方法和一个由另一个方法调用并实现的受保护抽象方法在子 classes 中。

通过这种方式,您可以实现适用于基础 class 中所有子 class 的内容,并避免代码重复。生成的基数 class 看起来像这样:

public abstract class AbstractConfig {

    public String doStuff(List<Params> params) {
        if (performErrorChecks()) {
            return doTheActualStuff(params);
        }
        return null;
    }

    protected abstract String doTheActualStuff(List<Params> params);
}

而子classes 将只实现 doTheActualStuff():

public class CustomConfig extends AbstractConfig {

    @Override
    protected String doTheActualStuff(List<Params> params) {
        ...
    }
}

您也可以在 AbstractConfig 中将 doStuff() 声明为 final。这将另外防止任何 subclass 覆盖 doStuff() 并意外替换您的常见错误检查。