如何快速确定方法是否在 Java 中被覆盖

2022-09-02 00:23:40

如果我可以确定同一类中的另一个方法未被重写,则可以将其应用于我的一个方法。这只是一个轻微的优化,所以反射是不可能的。我是否应该只创建一个受保护的方法,该方法返回所讨论的方法是否被覆盖,以便子类可以使其返回 true?


答案 1

我不会这样做。它违反了封装,并在实现者不知道的情况下更改了类应该做什么的契约。

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

class.getMethod("myMethod").getDeclaringClass();

如果返回的类是你自己的,则不会被覆盖;如果它是其他东西,则该子类已覆盖它。是的,这是反射,但它仍然很便宜。

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

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.
  }
}

答案 2

好吧,我的优化是逐个案例的小收益,它只会加快速度,因为它每秒被称为数百次。

您可能希望了解 Java 优化器可以执行的操作。手动编码的优化可能不是必需的。

如果您确定需要手动编码优化,则您描述的受保护方法方法不是一个好主意,因为它公开了实现的详细信息。


推荐