如何避免代码重复在子类

时间:2015-05-21 17:15:41

标签: java code-duplication

我有一个抽象的基类,如下所示:

public abstract class AbstractConfig {

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

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

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

         return somethingElse; 
     }
}

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

1 个答案:

答案 0 :(得分:3)

我建议你将方法拆分为两个单独的方法,一个在基类中实现的公共方法和一个受其他方法调用并在子类中实现的受保护抽象方法。

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

public abstract class AbstractConfig {

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

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

子类只会实现doTheActualStuff()

public class CustomConfig extends AbstractConfig {

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

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