向后兼容性使得抽象方法非抽象与空实现是否安全

时间:2018-04-20 11:46:44

标签: java

假设我们有这样的课程:

public abstract class AbstractClass{

  protected abstract void validate() throws ValidationException;

  public void doAction() throws ValidationException{
    validate();
    //some more actions
  }
}

这个类有很多实现。我发现在90%的实现方法中, validate()没有正文,即90%的继承者都是空的。我想重构它:

protected void validate() throws ValidationException{
   //empty body
}

这种重构是否可以向后兼容?

2 个答案:

答案 0 :(得分:4)

在技术方面“它会起作用吗?”条款,没关系。立即想到的唯一真正的问题是长期维护问题:如果在某些时候它将代码添加到它,许多实现可能不会调用它,因为曾经是抽象的(例如,它们不会有super.validate()),所以他们会错过运行那个(假设的)代码。

另一个模糊的担忧是,这意味着子类作者不一定要停下来思考“我需要在validate中做些什么吗?”鉴于您目前的结构,至少会提示他们考虑这一点。

答案 1 :(得分:2)

是的。在旧版本中,您已经被迫实现它,现在每个实现都会覆盖它。

没有什么(好吧,你可以有一些非常时髦的代码,但这不太可能)会破坏,因为抽象方法的唯一特殊处理是强制实现它。