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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Делегирование при помощи java.lang.reflect.Method 
:(
    Опции темы
C4Grey
  Дата 31.3.2012, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Приветствую
Есть самописный мультипоточный сервер на сокетх. Каждый сокет обернут в обработчик(наследник Thread), который читает сообщения, обрабатывает исключения + еще пару функций. Сообщения - сериализируемые классы, все имеют целочисельное поле DataType(наследуется от базового класса собщений). К обработчику прикреплен класс MessageProcessor, который описывает логику обработки сообщения(отправить список игроков, добавить пользователя в комнату, переслать сообщение всем игрокам, и т.п.). Выбор метода обработки происходит по switch (AMessage.DataType) - в зависимости от соответствия DataType определенной константе выполняем некую функцию класса MessageProcessor. С Java работаю не очень давно, недавно узнал что в ней есть возможность создания методов-делегатов. Стало интересно, какой метод будет быстрее работать: switch в цикле чтения, или альтернатива - в конструкторе MessageProcessor(и наследников) формировать массив делегатов и дергать их по константе. Как-то так:

Код

protected void AddMethod(String AName, int AID) throws NoSuchMethodException, SecurityException
{
    Method vMethod = FThisClass.getMethod(AName, FMessageClass);
    FMethods[AID] = vMethod;    
}

и при чтении вызываем нужный метод:
Код

FMethods[AMessage.DataType].invoke(this, AMessage);

Примеры упрощенные, без проверок на существование метода(в случае, если пришел неизвестный ID) и т.п.

Вроде храним мы только ссылки на методы, по идее должно работать резвее, но так как Java я почти не знаю - прошу совета.

Это сообщение отредактировал(а) C4Grey - 31.3.2012, 00:35
PM MAIL   Вверх
kosmonaFFFt
Дата 31.3.2012, 16:47 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Насколько я знаю, reflection довольно медленный, лучше было бы сделать один интерфейс для обработчиков, и каждый обработчик сделать как его реализацию, а в коллекции уже хранить ссылки на объекты обработчиков...


--------------------
user posted image
PM MAIL ICQ   Вверх
C4Grey
Дата 1.4.2012, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за ответ
Касательно распределения обработчиков по классам - думал об этом, даже частично реализовал, но большинство методов - строчек 10 кода, заводить ради них по классу...ну, как-то странно smile . Касательно reflection - встречал несколько статей, где её тормознутость в самом начале рассматривается как аксиома, а дальше зачем-то эту аксиому доказывают, замеряя скорость выполнения getMethod, getConstructor и т.п. Меня интересует конкретно invoke с уже имеющейся ссылкой, подождать пару лишних секунд при коннекте не проблематично(можно было бы сделать статический класс-утилиту для обработки и выполянть поиск методов один раз, но манипуляции с потоками, семафорами, синхронизациями и прочими мультипоточными хитростями, являющимися для Java нормой, для меня внове - как-то удалось наладить существующую систему, пока не особо хочу менять структуру). 
P.S.
Пока что самой полезной для меня оказалась эта статья: http://habrahabr.ru/post/69552/ . Если исходить из представленных в ней статистических данных(хотя и не совсме корректно, на мой взгляд, собранных) то invoke осуществляется приблизительно в 100 раз медленнее прямого вызова. Думаю что полный ответ на свой вопрос получу только после собственного тестирования smile 
PM MAIL   Вверх
COVD
Дата 1.4.2012, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

строчек 10 кода, заводить ради них по классу...ну, как-то странно 

Отнюдь. Это просто и наглядно. Эти классы, если они небольшие, удобно создавать как анонимные (реализации интерфейса), т.е. не хранить каждый класс в отдельном файле.

Код

public interface DoIt {
   void doSomething(int i, double x);
}
private DoIt[] processors = new DoIt[256];

int id = 0;
processors[id] = new  DoIt (){
     void doSomething(int i, double x){
         // code for id = 0
     }
};
id = 1;
processors[id] = new  DoIt (){
     void doSomething(int i, double x){
         // code for id = 1     }
};
...


Это сообщение отредактировал(а) COVD - 1.4.2012, 22:07
PM MAIL   Вверх
C4Grey
Дата 2.4.2012, 21:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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


 




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


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

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