Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Анонимные классы 
V
    Опции темы
Sherst
Дата 13.4.2006, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 26.10.2005

Репутация: нет
Всего: 2



Привет всем!
Объясните пожайлуста принцип работы анонимных внутренних классов и зачем они используются.
Заранее спасибо.
PM MAIL   Вверх
garm
Дата 13.4.2006, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 23.3.2006

Репутация: 2
Всего: 2



И тебе привет.
Анонимные внутренние классы - это внутренние классы без имени. Поэтому им приходится реализовывать какой либо интерфейс или расширять какой либо класс.
Выглядит это примерно так:
Код

Interface i = new Interface()
{
        public void method1()
        {
               //Реализация метода.
        }
        //Остальные методы.
}

Где Interface - некий интерфейс.
Наверное я не ошибусь, если скажу что основная область применения таких классов - реализация интерфейсов слушателей событий.
Подробнее можешь прочитать вот здесь.
Хотя некоторые люди считают, что использование анонимных внутренних классов - не очень хорошая практика.
PM   Вверх
batigoal
Дата 13.4.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(garm @ 13.4.2006, 20:39 Найти цитируемый пост)
Хотя некоторые люди считают, что использование анонимных внутренних классов - не очень хорошая практика.

Поясню - они несколько ухудшают читабельность. Но зато позволяют избавиться от явного создания кучи мелких вспомогательных классов.

И еще одна небольшая добавка: при компиляции класса MainClass, содержащего анонимный внутренний класс, у тебя получится два class-файла: MainClass.class (основной) и MainClass$1.class (такое имя будет присвоено анонимному классу).


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
ALKS
Дата 13.4.2006, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 354
Регистрация: 22.3.2006

Репутация: 1
Всего: 11



Цитата(Lamer George @ 13.4.2006, 20:32)
Цитата(garm @  13.4.2006,  20:39 Найти цитируемый пост)
Хотя некоторые люди считают, что использование анонимных внутренних классов - не очень хорошая практика.

Поясню - они несколько ухудшают читабельность. Но зато позволяют избавиться от явного создания кучи мелких вспомогательных классов.

И еще одна небольшая добавка: при компиляции класса MainClass, содержащего анонимный внутренний класс, у тебя получится два class-файла: MainClass.class (основной) и MainClass$1.class (такое имя будет присвоено анонимному классу).

Я не согласен с тем что эта техника ухудшает читабельность. Я очень хорошо помню этот довод во временя споров 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
PM   Вверх
Sherst
Дата 14.4.2006, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 26.10.2005

Репутация: нет
Всего: 2



Расширяю анонимным классом обычный класс Test:

Код

class Test {
    public void dom (){
        System.out.println("In Test...");
    }
}


public class Main {        
    Main() {        
    }
  
    public Test getCls() {
        return new Test() {
           public void dom() {
               System.out.println("Reload");
           } 
           public void lop(){   //Здесь я добавил новый метод
               System.out.println("Lop...");
           }
        };
    }
    //
    public static void main(String[] args) {        
        Main g = new Main();
        Test v = g.getCls();  //доступно только v.dom()
    }    
}


Как теперь в main методе вызвать метод анонимного класса - lop() ?
PM MAIL   Вверх
LSD
Дата 14.4.2006, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Sherst @ 14.4.2006, 10:16 Найти цитируемый пост)
Как теперь в main методе вызвать метод анонимного класса - lop() ?

Никак. Только через рефлексию, или объявить метод 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.
PM MAIL WWW   Вверх
Sherst
Дата 14.4.2006, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 26.10.2005

Репутация: нет
Всего: 2



Кому интересно, привожу пример вызова метода посредством использования рефлексии:

Код

package javaapplication7;
import java.lang.reflect.*;

class Test {
    public void dom (){
        System.out.println("In Test...");
    }
}

public class Main {        
    Main() {        
    }

    
    public Test getCls() {
        return new Test() {
           public void dom() {
               System.out.println("Reload");
           } 
           public void lop(){
               System.out.println("Lop...");
           }
        };
    }
    //
    public static void main(String[] args) {        
        Main g = new Main();        
        Method[] m = g.getCls().getClass().getDeclaredMethods();
        
        //public void javaapplication7.Main$2.lop() -полное наименование метода внутреннего анонимного класса, расширяющего Test
        for (int i=0; i < m.length; i++){
            if (m[i].toString().equals("public void javaapplication7.Main$2.lop()")) {
                try {
                    m[i].invoke(g.getCls(), null);
                } 
                catch(java.lang.IllegalAccessException ex){                    
                }
                catch(java.lang.reflect.InvocationTargetException er){                    
                }
            }                                    
        }
             
    }
}    

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.