То, что все остальные говорили об оптимизации, абсолютно верно.
Нет смысла с точки зрения производительности для включения метода. Если это проблема с производительностью, JIT в вашей JVM включит ее. В Java вызовы методов настолько близки к бесплатному, что об этом не стоит и думать.
Как говорится, здесь другая проблема. А именно, является плохой практикой программирования для вызова переопределяемого метода (то есть того, который не является final
, static
или private
) из конструктора. (Эффективная Java, 2-е изд., Стр. 89 в пункте, озаглавленном «Дизайн и документ для наследования или иным образом запрещающий его»)
Что произойдет, если кто-то добавит подкласс BinarySearchTree
с именем LoggingBinarySearchTree
, который переопределяет все открытые методы с помощью следующего кода:
public void clear(){
this.callLog.addCall("clear");
super.clear();
}
Тогда LoggingBinarySearchTree
никогда не будет конструируемым! Проблема в том, что this.callLog
будет null
при работе конструктора BinarySearchTree
, но вызываемый clear
переопределен, и вы получите NullPointerException
.
Обратите внимание, что здесь Java и C ++ различаются: в C ++ конструктор суперкласса, который вызывает метод virtual
, в конечном итоге вызывает тот, который определен в суперклассе, а не переопределенный. Люди, переключающиеся между двумя языками, иногда забывают об этом.
Учитывая это, я думаю, что в вашем случае, возможно, будет чище встроить метод clear
при вызове из конструктора , но в целом в Java вы должны идти дальше и делать все вызовы методов, которые вы хотите .