Eclipse - `открытая иерархия вызовов` прекратить поиск в лямбда-цепочке
Вот мой пример кода Java:
public class Test {
public static void main(String[] args) {
methodDepth0(
()->
methodDepth1(
()->
methodDepth2()
)
);
}
static Object methodDepth2() {
return null;
}
interface MyIF {
void call();
}
static void methodDepth0(MyIF myIf){
myIf.call();
}
interface MyIF2 {
void call();
}
static void methodDepth1(MyIF2 myIf2){
myIf2.call();
}
}
Когда я открываю вызов иерархии метода methodDepth2()
из Затмения (4.4), open call hierarchy
прекратить поиск следующего абонента:
То, что я ожидаю, похоже на открытие иерархии вызовов метода methodDepth1()
которые показывают, пока main
метод. methodDepth1 () code>, которая отображается до метода main code">
2 ответа
Из того, что я могу сказать, отсутствие глубины иерархии вызовов связано с (пере) оценкой кода во время выполнения. Это объясняется в 15.27.4. Оценка лямбда-выражений во время выполнения в спецификации языка Java.
Во время выполнения оценка лямбда-выражения аналогична оценке выражения создания экземпляра класса, поскольку при нормальном завершении создается ссылка на объект. Оценка лямбда-выражения отличается от исполнения лямбда-тела.
Как ясно показывает вторая картинка, Eclipse может отслеживать иерархию вызовов через вызов метода myIf.call()
внутри methodDepth0
, Это правильно, потому что (внешняя) лямбда реализует метод MyIF.call()
,
Тот факт, что тот же шаблон не работает на следующем уровне вложенности, выглядит как ошибка. Пожалуйста, рассмотрите возможность регистрации ошибки для JDT/UI. ТИА.
Просто отметьте, что для лямбда-выражений, реализующих библиотеки типа Consumer<T>
количество звонивших в accept(T)
в рабочей области может легко стать неуправляемым, подобно любой иерархии вызовов, например, через Runnable.run()
- но это не ставит под сомнение общую полезность иерархии вызовов через лямбды.