0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Анонимные классы объявляются без указания в коде имени класса.</p>
1
<p>Анонимные классы объявляются без указания в коде имени класса.</p>
2
<p>Анонимные классы могут быть созданы:</p>
2
<p>Анонимные классы могут быть созданы:</p>
3
<ol><li>как реализация интерфейса</li>
3
<ol><li>как реализация интерфейса</li>
4
</ol><p>На практике, чаще, реализуют функциональные интерфейсы, с помощью анонимных классов, не смотря на наличие лямбд. Вот<a>перечень функциональных интерфейсов</a>из пакета java.util.function. Это не магия, а просто набор готовых заготовок для ваших будущих реализаций.</p>
4
</ol><p>На практике, чаще, реализуют функциональные интерфейсы, с помощью анонимных классов, не смотря на наличие лямбд. Вот<a>перечень функциональных интерфейсов</a>из пакета java.util.function. Это не магия, а просто набор готовых заготовок для ваших будущих реализаций.</p>
5
<ol><li>как наследник определенного класса</li>
5
<ol><li>как наследник определенного класса</li>
6
</ol><p>Анонимный класс может быть как статическим, так и нестатическим. Это напрямую зависит от того, статическим или нестатическим является блок, в котором анонимный класс был объявлен.</p>
6
</ol><p>Анонимный класс может быть как статическим, так и нестатическим. Это напрямую зависит от того, статическим или нестатическим является блок, в котором анонимный класс был объявлен.</p>
7
<p>Если анонимный класс объявлен в статическом блоке:</p>
7
<p>Если анонимный класс объявлен в статическом блоке:</p>
8
<p>То его второй экземпляр можно создать так: Consumer otherInstance = foo.getClass().newInstance(); (эту строку нужно завернуть в try-catch или пробросить исключения выше). И переиспользуем ту же логику, но уже в другом инстансе: otherInstance.accept("Работа второго экземпляра анонимного класса в статическом методе.");.</p>
8
<p>То его второй экземпляр можно создать так: Consumer otherInstance = foo.getClass().newInstance(); (эту строку нужно завернуть в try-catch или пробросить исключения выше). И переиспользуем ту же логику, но уже в другом инстансе: otherInstance.accept("Работа второго экземпляра анонимного класса в статическом методе.");.</p>
9
<p>Если же анонимный класс был объявлен внутри<strong>не</strong>статического блока, то для создания второго экземпляра анонимного класса нужно передать в его конструктор ссылку на обрамляющий класс. В противном случае получим InstantiationException.</p>
9
<p>Если же анонимный класс был объявлен внутри<strong>не</strong>статического блока, то для создания второго экземпляра анонимного класса нужно передать в его конструктор ссылку на обрамляющий класс. В противном случае получим InstantiationException.</p>
10
<p>Вот как это выглядит в коде:</p>
10
<p>Вот как это выглядит в коде:</p>
11
<p>Любой анонимный внутренний класс может за один раз реализовать только один интерфейс. Так же, за один раз можно либо расширить класс, либо реализовать интерфейс, но не одновременно.</p>
11
<p>Любой анонимный внутренний класс может за один раз реализовать только один интерфейс. Так же, за один раз можно либо расширить класс, либо реализовать интерфейс, но не одновременно.</p>
12
<p>Анонимные классы полезны в некоторых "узких" участках кода, когда нет необходимости их потом переиспользовать где-то еще. Чаще всего на практике используют лишь один экземпляр анонимного класса. Если же реализацию интерфейса придется использовать много раз в коде - то лучше использовать лямбда-выражения (лямбды), которые стали доступны начиная с JAVA 8.</p>
12
<p>Анонимные классы полезны в некоторых "узких" участках кода, когда нет необходимости их потом переиспользовать где-то еще. Чаще всего на практике используют лишь один экземпляр анонимного класса. Если же реализацию интерфейса придется использовать много раз в коде - то лучше использовать лямбда-выражения (лямбды), которые стали доступны начиная с JAVA 8.</p>
13
<p>Например, реализацию интерфейса Consumer, в текущем уроке, можно переписать с помощью лямбд:</p>
13
<p>Например, реализацию интерфейса Consumer, в текущем уроке, можно переписать с помощью лямбд:</p>
14
<p>Преимущества и недостатки между анонимными классами и лямбдами постепенно меняются в сторону лямбд. Об этих различиях можно почитать<a>в статье на Хабре</a>.</p>
14
<p>Преимущества и недостатки между анонимными классами и лямбдами постепенно меняются в сторону лямбд. Об этих различиях можно почитать<a>в статье на Хабре</a>.</p>
15
<p>Отдельно стоит упомянуть, что не все версии Android поддерживают лямбды. И многим будет проще использовать анонимные классы, чем прикручивать лямбды.</p>
15
<p>Отдельно стоит упомянуть, что не все версии Android поддерживают лямбды. И многим будет проще использовать анонимные классы, чем прикручивать лямбды.</p>