Инициализация двойной скобки Java против лямбды

Если вы будете искать 'java double brace', вы найдете веские аргументы против ее использования.

Каждый раз, когда кто-то использует двойную инициализацию, котенка убивают. /questions/6067683/chto-takoe-initsializatsiya-dvojnoj-skobki-v-java/6067695#6067695

Аргументы в том, что вы создаете слишком много анонимных классов и потенциально создаете утечку памяти.

Лямбды разные? Каждый из них создает анонимный внутренний класс, каждый ссылается на закрывающее закрытие.

2 ответа

Решение

Лямбда-выражения отличаются от анонимного внутреннего класса, который реализует функциональный интерфейс.

Анонимные внутренние классы будут создавать свой собственный файл классов при компиляции, обычно что-то вроде Foo$1.class, если он содержится в Foo учебный класс. Это полностью функциональный класс, который реализует интерфейс или подклассы класса. Чтобы сослаться на локальные значения за пределами своей области, он за кулисами создаст переменную экземпляра в анонимном внутреннем классе, который представляет копию значения. Вот почему переменная должна быть фактически конечной - в противном случае фактическая переменная может измениться, а копия может оказаться устаревшей.

Лямбда-выражения не создают анонимных внутренних классов. Они используют java.lang.invoke.LambdaMetafactory который производит CallSite это может быть использовано позже для выполнения лямбда-выражения. Лямбда-выражение, будь то блок или выражение, преобразуется в скрытый частный статический метод внутри класса, в котором оно содержится. Вместо создания класса со скрытой переменной захваченные значения переводятся в параметры скрытого частного статического метода. Локальные значения по-прежнему должны быть действительно окончательными, поскольку значение, переданное методу, снова является копией. Метод вызывается invokedynamic инструкция в JVM.

Источники:

Да, они разные.

  • Лямбды на самом деле не обязательно создают анонимные классы - они, конечно, не просто переводятся в эквивалентный анонимный класс. Их создание намного более запутанное, чем это, и часто заканчивается анонимным классом, созданным во время выполнения, но не обязательно.
  • В частности, лямбда-выражения не содержат ничего, кроме специально упомянутых в них переменных, в отличие от анонимных внутренних классов, которые захватывают объект класса-объекта, если они определены в методе экземпляра.
Другие вопросы по тегам