Java 当父类中的受保护(或抽象)方法被删除且子类已实现时,如何导致编译错误/警告

Java 当父类中的受保护(或抽象)方法被删除且子类已实现时,如何导致编译错误/警告,java,oop,java1.4,Java,Oop,Java1.4,假设您有一个名为Vehicle的类,它概述了一个名为speed的受保护(也可能是抽象)方法。并且,子类Car重写该方法以定义其自己的实现 现在,假设不再需要车辆类中的速度方法(假设所有车辆出于任何原因都处于静止状态) 如果我从Vehicle中删除方法speed,我想抛出一个编译错误,这样删除该方法的开发人员就知道子类可能依赖它来执行某些操作 从技术上讲,编译错误是不需要的,但是当发生这种重新分解时,某种类型的通知会成为一个障碍。有没有一种编程模式可以用来处理这种情况 更新:我使用的是Java 1

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

现在,假设不再需要车辆类中的速度方法(假设所有车辆出于任何原因都处于静止状态)

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

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


更新:我使用的是Java 1.4(抱歉!)

这个
@Override
注释就是专门用于此目的的


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

注释
@Override
就是专门用于此目的的


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

使用
@Override
注释子类中的方法。 一旦从基类中删除该方法,Eclipse和javac等工具将为那些不再重写的方法发出警告

编辑:在Java 1.5.0之前,您不能使用
@Override
,但有一个名为。早在J2EE和EJB2.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:warning-@inheritDoc已使用,但myAwesomeMethod不重写或实现任何方法


对子类中的方法使用
@Override
注释。 一旦从基类中删除该方法,Eclipse和javac等工具将为那些不再重写的方法发出警告

编辑:在Java 1.5.0之前,您不能使用
@Override
,但有一个名为。早在J2EE和EJB2.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:warning-@inheritDoc已使用,但myAwesomeMethod不重写或实现任何方法


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

您可以在嵌套类中编写
super.speed()
,并在父类中保留此方法为空。如果现在在父级中删除此方法,则会出现异常。但是有一个缺点-您必须从所有重写的方法调用它。试试看,也许这会帮助您

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

1) 子类调用该方法而不定义自己的实现。方法不存在。
2) 子类定义了该方法,但包含对super的调用。同样,该方法不存在。

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

1) 子类调用该方法而不定义自己的实现。方法不存在。
2) 子类定义了该方法,但包含对super的调用。同样,该方法不存在。

抱歉,我使用Java 1.4更新了问题,以反映我使用JavaDoc hack更新了答案。很抱歉,我用Java1.4更新了这个问题,以反映我用JavaDoc黑客更新了答案。看看你是否可以使用它。我认为注释只在1.5中添加,这表明在1.4中没有办法做到这一点。@LouisWasserman这就是为什么我在OP澄清后编辑了这个问题。AOP本质上与注释没有关系,类路径扫描也没有关系。我认为注释只是在1.5中添加的,这表明在1.4中没有办法做到这一点。