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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зачем getListenerList() возвращает пары? 
:(
    Опции темы
Dims
Дата 19.12.2007, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

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



Не пойму, зачем EventListenerList.getListenerList возвращает пары? Разве нельзя было бы пользоваться instance of?
PM MAIL   Вверх
AlexeyVorotnikov
Дата 19.12.2007, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 18.6.2007
Где: Москва

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



Загадка сия великая есть smile))

Ну вот сделали так сановцы. Я лично никогда его и не использую.


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
AntonSaburov
Дата 19.12.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



А если над кодом подумать ?

Первый параметр - это ссылка на класс, а второй - на объект.

Код

 // Notify all listeners that have registered interest for
 // notification on this event type.  The event instance 
 // is lazily created using the parameters passed into 
 // the fire method.

 protected void fireFooXXX() 
 {
     // Guaranteed to return a non-null array
     Object[] listeners = listenerList.getListenerList();
     // Process the listeners last to first, notifying
     // those that are interested in this event
     for (int i = listeners.length-2; i>=0; i-=2) {
         if (listeners[i]==FooListener.class) {
             // Lazily create the event:
             if (fooEvent == null)
                 fooEvent = new FooEvent(this);
             ((FooListener)listeners[i+1]).fooXXX(fooEvent);
         }
     }
 }

PM MAIL WWW ICQ   Вверх
AlexeyVorotnikov
Дата 19.12.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 18.6.2007
Где: Москва

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



Цитата(AntonSaburov @  19.12.2007,  14:45 Найти цитируемый пост)
А если над кодом подумать ?

Первый параметр - это ссылка на класс, а второй - на объект.

И что?

IMHO, сваливать в одну кучу разные листенеры -- идея некрасивая.


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
Dims
Дата 19.12.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

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



Цитата(AntonSaburov @  19.12.2007,  14:45 Найти цитируемый пост)
Первый параметр - это ссылка на класс, а второй - на объект.

Зачем нужна ссылка на класс, если её можно как непосредственно получить, зная объект, так и сделать проверку с помощью instanceof?

В частности, если бы функция возвращала бы просто массив листенеров, то код из справки можно было бы написать яснее:

Код

protected void fireFooXXX() 
 {

   for( EventListener listener : listenerList.getListenerList() ) {
      if( listener instanceof FooListener ) {
         if (fooEvent == null)
                 fooEvent = new FooEvent(this);
             ((FooListener)listener.fooXXX(fooEvent);
      }
   }
}


Не так?
PM MAIL   Вверх
nornad
Дата 19.12.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Цитата(Dims @  19.12.2007,  22:59 Найти цитируемый пост)
и сделать проверку с помощью instanceof?

Если вдруг не в курсе, instanceof не всегда даёт желаемый результат. Вот пример:
Код

class A {}
class B extends A {}
class C {}
...
Object o = ...
if(o instanceof A) {
  // ok
} else if(o instanceof B) {
  // bad!
} else if(o instanceof C) {
  // ok
}

Поставь вместо комментариев вывод в консоль и подай на "вход" поочерёдно объекты всех трёх классов.

Добавлено через 2 минуты и 12 секунд
Кроме того, листенеров у тебя может быть тьма тьмущая с различными вариантами наследования и перебирать всё инстансофами не только не смешно, но и опасно (поставишь инстансоф на свой класс листенера, потом кто-то его унаследует, а обработать по-своему не сможет).


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Dims
Дата 21.12.2007, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

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



Хорошо, вместо

Код

if( listener instanceof FooListener ) {


напишем

Код

if( listener.getClass() == FooListener.class ) {

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

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

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


 




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


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

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