如何快速确定方法是否在 Java 中被覆盖
2022-09-02 00:23:40
如果我可以确定同一类中的另一个方法未被重写,则可以将其应用于我的一个方法。这只是一个轻微的优化,所以反射是不可能的。我是否应该只创建一个受保护的方法,该方法返回所讨论的方法是否被覆盖,以便子类可以使其返回 true?
如果我可以确定同一类中的另一个方法未被重写,则可以将其应用于我的一个方法。这只是一个轻微的优化,所以反射是不可能的。我是否应该只创建一个受保护的方法,该方法返回所讨论的方法是否被覆盖,以便子类可以使其返回 true?
我不会这样做。它违反了封装,并在实现者不知道的情况下更改了类应该做什么的契约。
但是,如果您必须这样做,最好的方法是调用
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.
}
}
好吧,我的优化是逐个案例的小收益,它只会加快速度,因为它每秒被称为数百次。
您可能希望了解 Java 优化器可以执行的操作。手动编码的优化可能不是必需的。
如果您确定需要手动编码优化,则您描述的受保护方法方法不是一个好主意,因为它公开了实现的详细信息。