Я не вижу никакой функциональности в анонимном классе.
Может ли кто-нибудь объяснить мне, чем это может мне помочь?
К сожалению, я не понимаю. Конечно, я читал его документацию в Oracle, но я не вижу применения в производстве, которое работает, я вижу это как метод.
Анонимные классы в Java часто используются, например, в слушателях, обратных вызовах или событиях. Преимущество анонимного класса в том, что он может обращаться к локальным переменным в своей области.
Пример. Мы используем Dao , который дает нам результат запроса к базе данных в ResultCallback .
Мы хотим получить доступ к этой БД в контроллере и поместить результаты в соответствующие представления.
Мы также могли бы использовать любую локальную переменную в области действия анонимного класса, объявленного с модификатором final .
В двух словах, использование анонимного класса позволяет вам создать объект, который реализует определенный интерфейс, и иметь возможность использовать его свободно без необходимости явно определять класс.
Хотя использование анонимных классов никогда не является строго обязательным (всегда можно получить эквивалентный код, используя обычные классы), есть по крайней мере 3 преимущества их использования, о которых я могу думать и которые применимы при определенных обстоятельствах:
Чтобы лучше понять эти 3 пункта, давайте рассмотрим пример, где обычно используются анонимные классы: прослушиватели событий.
Например, допустим, вы работаете над проектом с визуальным интерфейсом, который включает несколько кнопок, и вам нужно определить, что должно происходить в событиях Click каждой кнопки. Это достигается указанием a
ActionListener
для каждой кнопки.Использование обычного класса
Без анонимных классов вы должны определить полный класс, реализующий интерфейс
ActionListener
:... который вы затем можете использовать в форме с кнопкой:
Хотя на первый взгляд это выглядит не так уж плохо с одной кнопкой, представьте себе сложность определения класса
ButtonXActionListener
для каждой кнопки, если в вашей форме их несколько.Кроме того, если вы посмотрите на код формы, не сразу станет понятно, что происходит, когда вы нажимаете кнопку. Необходимо открыть класс
Button1ActionListener
, чтобы иметь полную картину того, что должно произойти. Опять же, если у вас есть несколько кнопок, чтобы получить полную картину действий, вам нужно будет открыть и изучить несколько разных классов.И, наконец, обратите внимание, что в данном случае действие заключается в изменении текста поля в форме. Но поскольку у класса
Button1ActionListener
нет доступа к форме, необходимо определить конструктор только для того, чтобы иметь доступ к рассматриваемому полю. Это не идеально.Использование анонимного класса
С анонимным классом вам не нужно определять класс отдельно от формы. Вы можете определить действие для кнопки непосредственно в коде формы следующим образом:
Опять же, представьте, что вам нужно определить этот тип действия для нескольких кнопок на форме. Сразу видны преимущества по сравнению с предыдущим примером:
actionPerformed()
имеет прямой и удобный доступ к переменнойjText
и любым другим переменным в методе или классе формы. Это экономит ваш код по сравнению с обычным классом (как я упоминал ранее, в некоторой степени вложенные классы тоже могут помочь с этим, но я не хочу отходить от темы).Использование лямбда-выражения
Стоит отметить, что, начиная с Java 8, многие из типичных применений анонимных классов можно улучшить, используя вместо них лямбда-выражения . По сути, везде, где вам приходится работать с интерфейсом, который имеет один метод (как в случае с прослушивателями событий, такими как
ActionListener
), вы можете использовать лямбда-выражение , а не анонимный класс. Таким образом, хотя анонимные классы все еще используются, в Java 8 стало меньше ситуаций, в которых их использование было бы предпочтительным.Обратите внимание, как компактно выглядит эквивалентный код с использованием лямбда-выражения :
Как только вы изучите и привыкнете к синтаксису лямбда-выражений, вы увидите, что он обладает всеми преимуществами анонимных классов, но с гораздо более компактным синтаксисом.
Преимуществ анонимных классов много, но корень всего этого заключается в использовании так называемых «интерфейсов», которые помогают создавать как можно более абстрактные классы, чтобы их можно было повторно использовать позже (повторное использование кода). Одно из этих преимуществ заключается в том, что, передавая интерфейс в качестве параметра в анонимном классе, у вас есть возможность настроить действие для выполнения, и в процессе вы можете использовать локальные объекты под рукой. Таким образом, вам не нужно создавать еще один класс, который должен извлекать их с помощью метода catch:
Если нет, находясь в локальной перезаписывая метод интерфейса, вы вызываете только эту локальную JLabel и делаете с ней все, что хотите.
И помимо всего прочего, вы можете повторно использовать код с другим действием, которое вам нравится. Таким образом, мы пользуемся преимуществами объектно-ориентированного подхода, что избавляет нас от большого количества работы и огромного беспорядка в нашем коде. Давайте избегать избыточности кода.
Иногда мы делаем классы, которые делают почти то же самое, но только изменяют какое-то действие или параметры. А лучше сделать один класс, поддерживающий все.
Это похоже на производителя тамале, который не только знает, как делать раджас тамалес, но также делает их из моли, зелени, сладкого, ярочо и т. д. И такой класс намного мощнее. Потому что он поддерживает все.
Не знаю, правильно ли я себя понял. Привет.
На самом деле, это распространенный и актуальный метод.
НО...
Этот метод, который на самом деле является интерфейсом, будет отправлен в качестве параметра, чтобы другой метод обработал его и использовал содержимое этого кода.
Очевидно, что при отправке в другой метод функция будет не только той, что вы помещаете в анонимный класс, но также будет использоваться с дополнительной функцией:
Например, выполнение этого метода в другом потоке.
Что вы не можете сделать с помощью одного простого метода. В этом случае объект Thread требует его в качестве параметра своего метода run(), чтобы с помощью алгоритма это пользовательское действие, которым может быть привет, мир или что-то еще, выполнялось в другом потоке.