如何快速确定是否在Java中重写了方法

bgw*_*bgw 17 java oop methods optimization overriding

如果我可以确定同一类中的另一个方法没有被覆盖,那么可以对我的一个方法应用可能的优化.这只是一个小小的优化,所以反思是不可能的.我是否应该创建一个受保护的方法来返回有问题的方法是否被覆盖,这样子类可以使它返回true?

Joh*_*lla 33

我不会这样做.它违反了封装并改变了你的类应该做的事情的合同,而没有实施者知道它.

但是,如果必须这样做,最好的方法是调用

class.getMethod("myMethod").getDeclaringClass();
Run Code Online (Sandbox Code Playgroud)

如果返回的类是您自己的类,那么它不会被覆盖; 如果它是别的东西,那个子类已经覆盖了它.是的,这是反思,但它仍然相当便宜.

不过,我确实喜欢你的受保护方法.这看起来像这样:

public class ExpensiveStrategy {
  public void expensiveMethod() {
    // ...
    if (employOptimization()) {
      // take a shortcut
    }
  }

  protected boolean employOptimization() {
    return false;
  }
}

public class TargetedStrategy extends ExpensiveStrategy {
  @Override
  protected boolean employOptimization() {
    return true; // Now we can shortcut ExpensiveStrategy.
  }
}
Run Code Online (Sandbox Code Playgroud)


jdi*_*tal 7

好吧,我的优化是逐个案例的小收益,它只会加速很多东西,因为它每秒被调用数百次.

您可能希望了解Java优化器可以执行的操作.您的手动编码优化可能没有必要.

如果您认为手动编码优化是必要的,那么您描述的受保护方法方法并不是一个好主意,因为它暴露了您的实现细节.