powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как заменить switch полиморфизмом?
15 сообщений из 40, страница 2 из 2
Как заменить switch полиморфизмом?
    #39440262
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79В описании сказано, что прилетает только Object. По любому какой то if должен быть
Ну или если парсить этот объект и рефлексией генерировать обработчик, тогда можно без ветвлений, но рефлексия - это не очень быстро
Какой милый набор заблуждений.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440263
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда все просто: получаем тип сообщения, делаем createinstance, используя в качестве параметра тип объекта, вызываем метод созданного объекта.

Никаких сравнений, расширение обработчиков путем создания новых классов
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440343
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79тогда все просто: получаем тип сообщения, делаем createinstance, используя в качестве параметра тип объекта, вызываем метод созданного объекта.

Никаких сравнений, расширение обработчиков путем создания новых классов
А не проще, обработчики один раз создать и банально в HashMap затолкать

Такие паттерны могут только изготовители и продавцы памяти придумывать и советовать. Да и те уже на грани банкротства ( Toshiba ))) )

IMHO & AFAIK
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440381
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
redwhite90,
Поскольку упоминается спринг, напрашивается такое решение
Код: java
1.
2.
3.
4.
5.
interface Handler {
  Object processMessage(Object message);
}

... куча именованных бинов, реализующих interface Handler, столько, сколько типов сообщений


и обработка:
Код: java
1.
2.
3.
4.
ApplicationContext ctx = ApplicationContextProvider.getApplicationContext(); // или какой там метод будет работать в контексте
String beanName = getBeanNameFromMessage(Object message);
Handler handler = ctx.getBean(beanName, Handler.class);
handler.processMessage(message);
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440398
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Проще, не проще. ТС спросил, как обойтись без switch. Ему ответили.
А применять HashMap для поиска по идентификатору обработчика - это как раз таки и есть реализация фабричного метода
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440499
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бины, хеш-мапы со стратегиями полезны только в том случае, когда логика
процессинга сообщений нам заранее неизвестна но есть некий протокол
или договоренность что в системе, в рантайме на момент поступления сообщений
будет доступна новая логика которая готова процессить новой тип сообщений.
Технические нюансы реализации - произвольны.

Через switch или if-else мы такое не сделаем.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39449067
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90,

1. В сообщении кодировать номер типа (формата) сообщения.
2. На приемной стороне завести массив обработчиков, по одному на каждый формат.
3. Приняв сообщение, извлечь из него номер типа, по этому номеру извлечь нужный обработчик, и передать ему сообщение.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39449142
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и зачем тему подняли?
rfqпо этому номеру извлечь нужный обработчик
вот как раз это действие и спрашивалось.
По switch \ if ли это делать.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39449216
it_andrei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не заметил предлагали тут или нет перегрузку.

Можно создать класс обработчик с перегруженными конструкторами или методами и потом вызывать одинаково для всех сообщений
new Handle(message) или (new Handle()).doIt(message)
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39449221
it_andrei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя нет, не получится, у вас же там по сокету обмен.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39449305
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90приложение_1 засылает в приложение_2 сообщения (по одной трубе) Допустим, имеется 20 типов сообщений.
На каждый тип сообщения по отдельной трубе!
И все! Принимаем и cast 'им объекты с закрытыми глазами (:
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39449608
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В варианте с очень быстрым процессингом сообщений (типа Disruptor) будет
полезно сделать некий генерализованный Message с набором общих полей
типа int field1, field2 .... ; String sField1, sField2 и как-то юзать их без
проверки на тип сообщения.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39449663
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надеюсь, что команда switch в лучшем случае будет выполняется за единицы машинных тактов Нафига это оптимизировать и усложнять, мне не очень понятно.

Во всяких "обработчиках с очень быстрым процессингом сообщений (типа Disruptor)" все равно будут использоваться коллекции. А они IMHO в любом случае тормозить будут сильнее, чем банальный switch.

А общие поля собрать в общий класс-предок и наследоваться от него. В лучших традициях ООП середины 90-х.

IMHO
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39449919
andmed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня похожая задачка была. Нужно замапить было exceptions. Поскольку были экстендящие классы, я просто написал линейный if с isAssignableFrom() и последующим кастом. единственное нужно проверять порядок, т.к. дерево, в остально на на самом деле, просто. да, были замечания что много ифов, но красивее как, не придумал
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39450026
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Сообщения по формату разные. Их с десяток разных. Предлагаю также включить в класс реализацию обработчика этого конкретного типа сообщения.
redwhite90приложение_2 должно обработать каждое сообщение по разному.сообщения наследуются от одного класса/интерфейса,
где нужно определить метод process() - этот метод и будет
обработчиком для текущего экземпляра сообщения.
redwhite90по интерфейсу, который есть на стороне приложения_2 прилетает всегда Object.Всегда кастим к одному базовому классу/интерфейсу.
Приложению 2 достаточно вызвать у текущего сообщения метод process() .
+
Добавив несколько необходимых Listener 'ов, можно реагировать на события
происходящие в процессе обработки сообщения. Например, onProcessStart,
onProcessFailure, onProcessEnd и т.д.
...
Рейтинг: 0 / 0
15 сообщений из 40, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Как заменить switch полиморфизмом?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]