假设我们有这样的课程:
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
}
这种重构是否可以向后兼容?
答案 0 :(得分:4)
在技术方面“它会起作用吗?”条款,没关系。立即想到的唯一真正的问题是长期维护问题:如果在某些时候它将代码添加到它,许多实现可能不会调用它,因为曾经是抽象的(例如,它们不会有super.validate()
),所以他们会错过运行那个(假设的)代码。
另一个模糊的担忧是,这意味着子类作者不一定要停下来思考“我需要在validate
中做些什么吗?”鉴于您目前的结构,至少会提示他们考虑这一点。
答案 1 :(得分:2)
是的。在旧版本中,您已经被迫实现它,现在每个实现都会覆盖它。
没有什么(好吧,你可以有一些非常时髦的代码,但这不太可能)会破坏,因为抽象方法的唯一特殊处理是强制实现它。