HTML Diff
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>