【问题标题】:How to avoid code duplication doing input validation in subclass如何避免代码重复在子类中进行输入验证
【发布时间】:2015-05-21 17:15:41
【问题描述】:

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

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() inAbstractConfig 并在基类和每个子类中调用它似乎不是特别好或干净。

【问题讨论】:

    标签: java code-duplication


    【解决方案1】:

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

    通过这种方式,您可以实现适用于基类中所有子类的东西并避免代码重复。生成的基类如下所示:

    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) {
            ...
        }
    }
    

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

    【讨论】:

    • 好主意 +1。就我而言,我还需要在基类中使用具有默认实现的非抽象 doTheActualStuff
    • 这似乎是template 模式的一个很好的应用,我同意将doStuff 声明为final 是必要的。
    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 2017-10-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多