假设你有一个名为 Vehicle 的类,它概述了一种名为 speed 的受保护(也可以是抽象的)方法。并且,子类 Car 重写该方法以定义自己的实现。
现在,假设不再需要在车辆类中使用速度方法(假设所有车辆由于某种原因都将静止)。
如果我从 Vehicle中删除方法速度,我想抛出一个编译错误,以便删除该方法的开发人员知道子类可能依赖于它来执行某些操作。
从技术上讲,不需要编译错误,但是当发生这种重构时,某种通知会成为障碍。是否有一种编程模式可用于处理这种情况?
更新:我正在使用Java 1.4(对不起!
@Override
注释明确用于此目的。
如果您没有使用 Java 1.5+,那么没有,尽管您可以使用 AOP 来检测这些方法以引发异常,或者只是使用反射和类路径扫描来检查所有子类并检查是否存在所述方法。
如果它是抽象的,那么就没有可以从父类中删除的实现,并且您的风险归结为新的子类没有实现它。 如果在父实现中受保护和定义,则在删除父实现时,有两种情况应该已经引发编译器错误。
1)子类调用该方法而不定义自己的实现。 方法不存在。
2)子类定义方法,但包括对super的调用。 同样,该方法不存在。
您可以在嵌套类中编写super.speed()
,并在父类中将此方法留空。如果现在在父级中删除此方法,则会有一个异常。但是有一个缺点 - 您必须从所有覆盖的方法调用它。试试吧,也许这会帮助你
对子分支中的方法使用@Override
注释。从基类中删除该方法后,Eclipse 和 javac 等工具将为那些不再覆盖的方法发出警告。
编辑:虽然您不能在Java 1.5.0之前使用@Override
,但有一个名为xdoclet
的工具。早在 J2EE 和 EJB 2.1 时代,它就被用来"模拟"注解,并使用基于 javadoc 类标记的代码做神奇的事情。看看它,也许你可以使用它。
编辑 2:在 Java 1.4.x 中,您还可以使用 JavaDoc 标签{@inheritDoc}
进行此类验证。而不是用@Override
注释你的方法,而是用@inheritDoc
注释它,就像这样:
public class MyAwesomeClass extends BaseClass
{
/** {@inheritDoc} */
protected void myAweSomeMethod()
{
//...
}
}
现在,如果您在 BaseClass
中更改myAweSomeMethod
签名或删除它,您将收到来自 JavaDoc 工具的警告,类似于以下内容:
/home/npe/java-tests/MyAwesomeClass.java:4: 警告 - @inheritDoc使用,但 myAwesomeMethod 不会覆盖或实现任何方法。