@MustOverride注释?

Har*_*2k5 13 java abstract-class overriding annotations interface

在.NET中,可以为特定超类中的方法指定"mustoverride"属性,以确保子类覆盖该特定方法.我想知道是否有人有一个可以达到相同效果的自定义java注释.基本上我想要的是推动子类覆盖超类中的方法,该超类本身具有一些必须贯穿的逻辑.我不想使用抽象方法或接口,因为我希望在super方法中运行一些常用功能,但或多或​​少产生编译器警告/错误,表示派生类应该覆盖给定方法.

Sta*_*Man 19

我不太明白为什么你不想使用abstract修饰符 - 这是用于强制子类实现,只需要用于某些方法,而不是所有方法.或许您正在考虑C++风格的"纯抽象"类?

但是许多Java开发人员不知道的另一件事是,它也可以覆盖非抽象方法并将它们声明为抽象方法; 喜欢:

public abstract String toString(); // force re-definition
Run Code Online (Sandbox Code Playgroud)

所以即使java.lang.Object已经定义了一个实现,你也可以强制子类再次定义它.

  • 很多时候,人们可能希望在超级方法中使用基本逻辑,但是对于未来的开发人员提醒,如果不扩展此逻辑并调用super(),则子项无法根据业务需求预期正常行为. (4认同)

cle*_*tus 12

忽略抽象方法,Java中没有这样的工具.也许它可以创建一个编译时注释来强制这种行为(我不相信它),但就是这样.

真正的踢球者是"覆盖超类中的一个方法,它本身就有一些必须贯穿的逻辑".如果重写方法,除非显式调用它,否则不会调用超类的方法.

在这种情况下,我倾向于做类似的事情:

abstract public class Worker implements Runnable {
  @Override
  public final void run() {
    beforeWork();
    doWork();
    afterWork();
  }

  protected void beforeWork() { }
  protected void afterWork() { }
  abstract protected void doWork();
}
Run Code Online (Sandbox Code Playgroud)

通过接口的方法强制使用特定的逻辑结构.例如,您可以使用它来计算调用,而不必担心用户是否调用super.run()等.


arm*_*ino 5

...如果声明一个基类abstract不是一个选项,你总是可以抛出UnsupportedOperationException

class BaseClass {
    void mustOverride() {
        throw new UnsupportedOperationException("Must implement");
    }
}
Run Code Online (Sandbox Code Playgroud)

但这当然不是编译时检查......