Подтвердить что ты не робот

Являются ли Java8 lambdas ссылкой на свой закрытый экземпляр, например анонимные классы?

Мы знаем, что анонимные классы поддерживают ссылку на свой включенный экземпляр и что это может привести к утечкам контекста на Android.

Так как retrolambda поддерживает back-lambdas для Java7, возможно, стоит попробовать.

Похоже, что в Java8 lambdas нет этой проблемы, но я не могу найти никакой официальной информации об этом.

Любая подсказка?

4b9b3361

Ответ 1

Вот некоторая информация.

Из следующей ссылки http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html: Это полезно для управления памятью: в то время как экземпляры внутреннего класса всегда содержат сильную ссылку на свой включенный экземпляр, lambdas, которые не захватывают членов из вмещающего экземпляра, не содержат ссылки на него. Эта характеристика внутренних экземпляров класса часто может быть источником утечек памяти (так называемая проблема с задержкой слушателя)

Вы также можете увидеть http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html из текста: Вложенный класс: используйте его, если ваши требования аналогичны требованиям локального класса, вы хотите сделать этот тип более доступным, и вам не нужен доступ к локальным переменным или параметрам метода.

Используйте нестатический вложенный класс (или внутренний класс), если вам нужен доступ к закрывающим экземпляру непубличных полей и методов. Используйте статический вложенный класс, если вы не требуете этого доступа.

Ответ 2

Лямбда-выражения и ссылки на методы захватывают ссылку на this только в случае необходимости, т.е. когда на ссылку this ссылаются напрямую или на экземпляр (не static), доступ к которому осуществляется.

Конечно, если ваше лямбда-выражение захватывает значение локальной переменной, и это значение содержит ссылку на this, это также ссылается на this...