0

假设您有一个名为 Vehicle 的类,它概述了一个名为 speed 的受保护(也可以是抽象的)方法。并且,子类 Car 覆盖该方法以定义自己的实现。

现在,假设不再需要在 Vehicle 类中使用 speed 方法(假设所有车辆无论出于何种原因都将是静止的)。

如果我从 Vehicle 中删除方法速度,我想抛出一个编译错误,以便删除该方法的开发人员知道子类可能依赖它来执行某些操作。

从技术上讲,不需要编译错误,但是当这种重构发生时,某种通知会成为障碍。是否有可以用来处理这种情况的编程模式?

更新:我正在使用 Java 1.4(对不起!)

4

4 回答 4

2

@Override注释明确用于此目的。

如果您没有使用 Java 1.5+,那么不,尽管您可以使用 AOP 来检测这些方法以引发异常,或者只使用反射和类路径扫描来检查所有子类并检查是否存在所述方法。

于 2012-06-06T17:34:35.727 回答
1

如果它是抽象的,那么就没有可以从父类中删除的实现,并且您的风险归结为没有实现它的新子类。如果它在父级中受到保护和定义,则在删除父级实现时,有两种情况应该已经引发编译器错误。

1) 子类调用该方法而不定义自己的实现。方法不存在。

2) 子类定义方法,但包括对 super 的调用。同样,该方法不存在。

于 2012-06-06T17:44:55.887 回答
0

您可以在嵌套类中编写super.speed()并在父类中将此方法留空。如果您现在在父级中删除此方法,您将有一个异常。但是有一个缺点——你必须从所有被覆盖的方法中调用它。试试看,也许这对你有帮助

于 2012-06-06T17:44:05.057 回答
0

对子类中的方法使用@Override注释。从基类中删除方法后,Eclipsejavac等工具将对那些不再覆盖的方法发出警告。

编辑:虽然您不能@Override在 Java 1.5.0 之前使用,但有一个名为xdoclet. 在 J2EE 和 EJB 2.1 时代,这被用来“模拟”注释并使用基于类似 javadoc 的标记的代码做一些神奇的事情。看看它,也许你可以使用它。

编辑 2:在 Java 1.4.x 中,您还可以使用 JavaDoc 标签{@inheritDoc}进行这种验证。@Override而不是用注释来注释你的方法@inheritDoc,就像这样:

public class MyAwesomeClass extends BaseClass
{
    /** {@inheritDoc} */
    protected void myAweSomeMethod()
    {
        //...
    }
}

现在,如果您更改或删除中的myAweSomeMethod签名BaseClass,您将收到来自 JavaDoc 工具的警告,类似于以下内容:

/home/npe/java-tests/MyAwesomeClass.java:4:警告 - 使用了@inheritDoc,但 myAwesomeMethod 没有覆盖或实现任何方法。

于 2012-06-06T17:36:13.777 回答