У меня есть код вроде следующего:
class Foo {
Y func(X x) {...}
void doSomethingWithAFunc(Function<X,Y> f){...}
void hotFunction(){
doSomethingWithAFunc(this::func);
}
}
Предположим, что hotFunction
вызывается очень часто. Было бы целесообразно кэшировать this::func
, может быть, вот так:
class Foo {
Function<X,Y> f = this::func;
...
void hotFunction(){
doSomethingWithAFunc(f);
}
}
Насколько я понимаю ссылки на методы Java, виртуальная машина создает объект анонимного класса при использовании ссылки на метод. Таким образом, кэширование ссылки создало бы этот объект только один раз, когда первый подход создавал бы его при каждом вызове функции. Правильно ли это?
Если ссылки на методы, которые появляются в горячих позициях в коде, будут кэшироваться или VM может оптимизировать это и сделать кеширование лишним? Есть ли общая передовая практика в этом отношении или эта высокоинтеллектуальная реализация является специфическим для любого кэширования?