У меня есть иерархия классов, основанная на интерфейсе и реализованная с помощью абстрактного базового класса.Это выглядит примерно так:
interface Shape {
boolean checkFlag();
}
abstract class AbstractShape implements Shape {
private boolean flag = false;
protected AbstractShape() { /* compute flag value */ }
public final boolean checkFlag() { return flag; }
}
interface HasSides extends Shape {
int numberOfSides();
}
interface HasFiniteArea extends Shape {
double area();
}
class Square extends AbstractShape implements HasSides, HasFiniteArea {
}
class Circle extends AbstractShape implements HasFiniteArea {
}
/** etc **/
Когда я пробую исполняемый код с помощью VisualVM, выясняется, что AbstractShape.checkFlag () никогда не встроен и потребляет 14% от общего времени выполнения программы , что непристойно для такого простого метода, даже для так часто вызываемого метода.
Я пометил метод final в базовом классе, и (в настоящее время) все классы, реализующие интерфейс "Shape", расширяют AbstractShape.
Правильно ли я интерпретирую результаты примера VisualVM?Есть ли способ убедить JVM встроить этот метод или мне нужно вырвать интерфейсы и просто использовать абстрактный базовый класс?(Я бы предпочел этого не делать, потому что иерархия включает интерфейсы, такие как HasFiniteArea и HasSides, что означает, что иерархия не имеет идеальной древовидной формы)
РЕДАКТИРОВАТЬ: для ясности, это метод, который в любой вселенная должна быть встроенной.Он вызывается более 420 миллионов раз за 2 минуты выполнения, и, поскольку он не встроен и остается виртуальным вызовом, он составляет 14% времени выполнения.Я задаю вопрос: что мешает JVM встроить этот метод и как я могу это исправить?