![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Sherst |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 26.10.2005 Репутация: нет Всего: 2 |
Привет всем!
Объясните пожайлуста принцип работы анонимных внутренних классов и зачем они используются. Заранее спасибо. |
|||
|
||||
| garm |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 23.3.2006 Репутация: 2 Всего: 2 |
И тебе привет.
Анонимные внутренние классы - это внутренние классы без имени. Поэтому им приходится реализовывать какой либо интерфейс или расширять какой либо класс. Выглядит это примерно так:
Где Interface - некий интерфейс. Наверное я не ошибусь, если скажу что основная область применения таких классов - реализация интерфейсов слушателей событий. Подробнее можешь прочитать вот здесь. Хотя некоторые люди считают, что использование анонимных внутренних классов - не очень хорошая практика. |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
Поясню - они несколько ухудшают читабельность. Но зато позволяют избавиться от явного создания кучи мелких вспомогательных классов. И еще одна небольшая добавка: при компиляции класса MainClass, содержащего анонимный внутренний класс, у тебя получится два class-файла: MainClass.class (основной) и MainClass$1.class (такое имя будет присвоено анонимному классу). -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| ALKS |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 354 Регистрация: 22.3.2006 Репутация: 1 Всего: 11 |
Я не согласен с тем что эта техника ухудшает читабельность. Я очень хорошо помню этот довод во временя споров Pascal vs C. {} по сравнению с begin end ухудшает читабельность. a?b:c по сравнению с полноценным if a then b else c ухудшает читабельность. не правда. стандартый синтаксис не может ухудшать читабельность. просто людей по-началу смущают не знакомые и не типичные синтаксические конструкции. но когда вы 100 раз в течении 8 часов примените a?b:c оно уже не будет вам казаться нечетабельным. оно будет пониматься влет на уровне подсознания. и с анономными внутринними классами тоже самое. когда начнеш активно применять этот синтаксис и привыкниш к нему он больше не будет резать глаз. А для чего оно нужно? Для того чтоб не тратить силы на полноценное "оформление" относительно не больших и что самое главное однократно или почти однократно применяемых классов. "Мелкий" тут не довод потому что меокий класс может быть применен в 200 местах по коду. тут прелесть именно в том что если вам вот именно тут один раз в жизни нужно использовтаь объект этого класса то... смысла тратить силы на его полноценное оформление? Особенно красота раскрываеться если у вас есть для примера некий интерфейс и 40 реализаций этого интерфейса но каждая конкретная реализация применяеться буквально единожды. вот в таких вот случаях анонимные внутренние классы просто спасают. В java API есть много примеров грамотного использования этой идеи. классический пример это метод public File[] listFiles(FileFilter filter) класса java.io.File |
|||
|
||||
| Sherst |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 26.10.2005 Репутация: нет Всего: 2 |
Расширяю анонимным классом обычный класс Test:
Как теперь в main методе вызвать метод анонимного класса - lop() ? |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Никак. Только через рефлексию, или объявить метод lop() в классе Test. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Sherst |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 26.10.2005 Репутация: нет Всего: 2 |
Кому интересно, привожу пример вызова метода посредством использования рефлексии:
|
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |