|
|
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Arm79В описании сказано, что прилетает только Object. По любому какой то if должен быть Ну или если парсить этот объект и рефлексией генерировать обработчик, тогда можно без ветвлений, но рефлексия - это не очень быстро Какой милый набор заблуждений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 15:38 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
тогда все просто: получаем тип сообщения, делаем createinstance, используя в качестве параметра тип объекта, вызываем метод созданного объекта. Никаких сравнений, расширение обработчиков путем создания новых классов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 15:38 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Arm79тогда все просто: получаем тип сообщения, делаем createinstance, используя в качестве параметра тип объекта, вызываем метод созданного объекта. Никаких сравнений, расширение обработчиков путем создания новых классов А не проще, обработчики один раз создать и банально в HashMap затолкать Такие паттерны могут только изготовители и продавцы памяти придумывать и советовать. Да и те уже на грани банкротства ( Toshiba ))) ) IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 16:54 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
redwhite90, Поскольку упоминается спринг, напрашивается такое решение Код: java 1. 2. 3. 4. 5. и обработка: Код: java 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 17:27 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Проще, не проще. ТС спросил, как обойтись без switch. Ему ответили. А применять HashMap для поиска по идентификатору обработчика - это как раз таки и есть реализация фабричного метода ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 17:39 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Бины, хеш-мапы со стратегиями полезны только в том случае, когда логика процессинга сообщений нам заранее неизвестна но есть некий протокол или договоренность что в системе, в рантайме на момент поступления сообщений будет доступна новая логика которая готова процессить новой тип сообщений. Технические нюансы реализации - произвольны. Через switch или if-else мы такое не сделаем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 21:44 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
redwhite90, 1. В сообщении кодировать номер типа (формата) сообщения. 2. На приемной стороне завести массив обработчиков, по одному на каждый формат. 3. Приняв сообщение, извлечь из него номер типа, по этому номеру извлечь нужный обработчик, и передать ему сообщение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2017, 00:34 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
и зачем тему подняли? rfqпо этому номеру извлечь нужный обработчик вот как раз это действие и спрашивалось. По switch \ if ли это делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2017, 09:30 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Не заметил предлагали тут или нет перегрузку. Можно создать класс обработчик с перегруженными конструкторами или методами и потом вызывать одинаково для всех сообщений new Handle(message) или (new Handle()).doIt(message) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2017, 10:38 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Хотя нет, не получится, у вас же там по сокету обмен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2017, 10:46 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
redwhite90приложение_1 засылает в приложение_2 сообщения (по одной трубе) Допустим, имеется 20 типов сообщений. На каждый тип сообщения по отдельной трубе! И все! Принимаем и cast 'им объекты с закрытыми глазами (: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2017, 12:15 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
В варианте с очень быстрым процессингом сообщений (типа Disruptor) будет полезно сделать некий генерализованный Message с набором общих полей типа int field1, field2 .... ; String sField1, sField2 и как-то юзать их без проверки на тип сообщения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2017, 18:11 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Надеюсь, что команда switch в лучшем случае будет выполняется за единицы машинных тактов Нафига это оптимизировать и усложнять, мне не очень понятно. Во всяких "обработчиках с очень быстрым процессингом сообщений (типа Disruptor)" все равно будут использоваться коллекции. А они IMHO в любом случае тормозить будут сильнее, чем банальный switch. А общие поля собрать в общий класс-предок и наследоваться от него. В лучших традициях ООП середины 90-х. IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2017, 22:50 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
У меня похожая задачка была. Нужно замапить было exceptions. Поскольку были экстендящие классы, я просто написал линейный if с isAssignableFrom() и последующим кастом. единственное нужно проверять порядок, т.к. дерево, в остально на на самом деле, просто. да, были замечания что много ифов, но красивее как, не придумал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2017, 16:05 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
redwhite90Сообщения по формату разные. Их с десяток разных. Предлагаю также включить в класс реализацию обработчика этого конкретного типа сообщения. redwhite90приложение_2 должно обработать каждое сообщение по разному.сообщения наследуются от одного класса/интерфейса, где нужно определить метод process() - этот метод и будет обработчиком для текущего экземпляра сообщения. redwhite90по интерфейсу, который есть на стороне приложения_2 прилетает всегда Object.Всегда кастим к одному базовому классу/интерфейсу. Приложению 2 достаточно вызвать у текущего сообщения метод process() . + Добавив несколько необходимых Listener 'ов, можно реагировать на события происходящие в процессе обработки сообщения. Например, onProcessStart, onProcessFailure, onProcessEnd и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2017, 09:41 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39449663&tid=2122930]: |
0ms |
get settings: |
6ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
54ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 336ms |

| 0 / 0 |
