powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Внутренний не статический класс. Верный подход? WebSocket
25 сообщений из 61, страница 1 из 3
Внутренний не статический класс. Верный подход? WebSocket
    #39630701
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите правильность такого решения.

У меня есть точка подключения вебсокета на Java (сервер). В нем реализованы методы onOpen, onMessage, onClose и onError.

Речь пойдет о методе onMessage.

Мне не хочется набивать этот метод свичем который будет огромным для всех сообщений которые возможны.

Я сделал такую вот штуку (использовал внутренний не статический класс для обработки сообщений)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
@ServerEndpoint(value = "/endpoint", configurator = SocketConfigurator.class, encoders=WsEncoder.class, decoders=WsDecoder.class)
public class WsEndpoint {

    private static final Logger LOGGER = LogManager.getLogger(WsEndpoint.class);

    private static final CopyOnWriteArrayList<WsUser> wsWebUsers = new CopyOnWriteArrayList<WsUser>();

    public WsEndpoint() {
        LOGGER.info("ENDPOINT CREATED");
    }

    @OnOpen
    public void onOpen(Session session) {
        LOGGER.info("ENDPOINT ONOPEN");
    }

    @OnMessage
    public void onMessage(Session session, WsMessage wsMessage) {

        new WsOnMessage(session, wsMessage);

    }

    @OnClose
    public void onClose(Session session) {

    }

    @OnError
    public void onError(Session session, Throwable ex) {
        LOGGER.error("ENDPOINT ERROR", ex);
    }

    private class WsOnMessage {

        private Session session;
        private WsMessage wsMessage;

        public WsOnMessage(Session session, WsMessage wsMessage) {
            this.session = session;
            this.wsMessage = wsMessage;

            call();

        }

        private void call() {
            switch (wsMessage.getType()) {
                ...
            }
        }

    }

}



верно ли так делать? Может есть более элегантный способ обработки сообщений?

Спасибо.
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630709
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630719
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov MessageHangler ?

пример можно? пожалуйста
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630720
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прямо в документации?
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630724
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы сделал так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
interface MessageHandler {
    void handleMessage(...)
}

class MyMessageHandler1 implements MessageHandler {}
....
class MyMessageHandler47 implements MessageHandler {}



interface MessageHandlerFactory {
    MessageHandler createMessageHandlerByType(...)
}

class MessageHandlerFactoryImpl implements MessageHandlerFactory{
   MessageHandler createMessageHandlerByType(...)
} 


Как конкретно создавать экземпляры классов внутри "фабрики" - дело такое. Самый простой и топорный подход конечно через switch. Eсли объекты простые, то табличный метод

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
//псевдокод для понимания идеи
Map<MgsType, Class<? extends MessageHandler> messageHandlerMap= {
   type1 --> MyMessageHandler1.class,
   ...
   type47 --> MyMessageHandler47.class
}

messageHandlerMap.get(type).newInstance()



более элегантные (на мой вкус) варианты это создание через механизм dependency injection. особенно если объекты сложные, со своими зависимостями и т.д. В зависимости от кол-ва классов и сложности задачи можно промежуточные варианты использовать. Нет смысла городить огород ради например 3х примитивных классов с конструктором без параметров
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630726
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklop,
хочешь готовый вариант для любого количества сообщений?
согласованно работает с 21341657
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630727
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovПрямо в документации?

посмотрел. Суть не поменяется.

Я сделаю вот так:

Код: java
1.
2.
3.
4.
5.
6.
session.addMessageHandler(new MessageHandler.Whole<WsMessage>() {
            @Override
            public void onMessage(WsMessage wsMessage) {

            }
        });



Но чем это будет отличаться от этого?

Код: java
1.
2.
3.
4.
@OnMessage
    public void onMessage(Session session, WsMessage wsMessage) {

    }



В первом случае свитч все равно будет, как и во втором.
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630729
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklop...Мне не хочется набивать этот метод свичем который будет огромным для всех сообщений которые возможны....

AFAIK

В "нормальных языках программирование" ( TM ) есть ссылки на методы, т.ч. в них можно делать массив/HashMap и через него вызывать нужные методы.

В "старой ява" такого нет, т.ч. для каждого обработчика нужно создавать свой класс, что немного "тяжеловестно". В общем, банальный "pattern Command".

В "новой Java" появились closure, в данном случае они вполне могут сделать код чуть проще. Но в closure мне не очень нравится реализация обработки эксепшенов. Т.ч. я против прогресса и за старый код, чуть больше строк, зато понятнее, деревеннее и надежнее )))
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630731
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,

Это тут вообще не при чем.
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630733
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,
Код: java
1.
2.
3.
class MyMessageHandler1 implements MessageHandler {}
....
class MyMessageHandler47 implements MessageHandler {}


а если 300 надо?....
не оптимально, есть вариант проще
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630736
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяа если 300 надо?....
если у нас 300 обработчиков, каждый из которых делает что-то свое то пишем все 300, да

вадяесть вариант проще
расскажи
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630737
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklopвадя,

Это тут вообще не при чем.это ты пока начальной стадии.

Leonid KudryavtsevВ "нормальных языках программирование" ( TM ) есть ссылки на методы, т.ч. в них можно делать массив/HashMap и через него вызывать нужные методы.

В "старой ява" такого нет, т.ч. для каждого обработчика нужно создавать свой класс, что немного "тяжеловестно". В общем, банальный "pattern Command".

В "новой Java" появились closure, в данном случае они вполне могут сделать код чуть проще. Но в closure мне не очень нравится реализация обработки эксепшенов. Т.ч. я против прогресса и за старый код, чуть больше строк, зато понятнее, деревеннее и надежнее )))в java давно есть рефлексия, и с ней всё очень просто
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630739
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
На счет рефлексии согласен. Были варианты её использовать.
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630740
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaесли у нас 300 обработчиков, каждый из которых делает что-то свое то пишем все 300, даты не понял проблемы
вопрос не в количестве обработчиков, а как их вызвать
у меня на каждую страницу свой java файл обработчиков.
очень наглядно, удобно
и мне не надо их вызывать ни через case , ни через if

всё через рефлексию
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630745
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha, я так понимаю, Вы привели одну из возможных реализаций pattern Command.

Минусы примера, как я вижу:

1 - Factory. В принципе, в 99% задач это даром не надо, если события ходят часто, то проще уйти от ООП и инкапсуляции и, например, передавать обрабатываемые данные через параметры.

Лишняя операция создания объекта лично меня обычно напрягает

2 - много букв, т.к. нужно для каждой операции создавать свой класс. Но тут вполне могут помочь лямбды и клосуры в новой Java. По смыслу будет тоже самое, но буковок в итоге может оказаться меньше и код получится более компактный.

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

вадя....в java давно есть рефлексия, и с ней всё очень просто

IMHO & AFAIK рефлексия:
a) костыль
b) как всякий костыль, прощай производительность

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

IMHO & AFAIK
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630749
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,
что скажете на счет моего варианта?
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630751
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevIMHO & AFAIK рефлексия:
a) костыль
b) как всякий костыль, прощай производительность

Смысла использовать рефлексию для данной задачи, лично я полностью не вижу. Ну или только с целью создания гибко настраиваемой системы, но думаю и в этом случае без нее можно обойтись
а) кто такое сказал?
b) живете старыми данными - рефлексия уже очень давно не тормоз.

если у тебя 300 методов и чтоб выбрать нужный - без рефлексии только case и if.
и как будет выглядеть портянка из 300 case или 300 if
вот где с производительность прощай...
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630753
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
нет. у меня уже есть то что должно быть. Писал его я. Просто переписываю под модульность.
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630754
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsyklopLeonid Kudryavtsev,
что скажете на счет моего варианта?

вариант, как вариант. Вы же сами сказали:

TsyklopМне не хочется набивать этот метод свичем который будет огромным для всех сообщений которые возможны.

или свитч, или если не хочется свитча, то HashMap. Простейший паттерн Command.

Chpasha пример реализации привел.

Если не нравится фабрика, можно ее просто выкинуть. Если не нравится необходимость создания классов, можно использовать closure в новой java. Если уж так хочется, то можно и рефлексию прицепить.

О чем тут дискутировать, я вообще не знаю ))). Конечно, полно обсуждений на 100500 страницах по "правильной реализации" даже таких паттернов как singleton и в принцеппе паттер command ничем не хуже )))... но это беспредметный "паттерно срачь" получится )))
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630755
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя....
если у тебя 300 методов и чтоб выбрать нужный - без рефлексии только case и if.
и как будет выглядеть портянка из 300 case или 300 if
вот где с производительность прощай...

HashMap чем не угодил ?
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630760
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,
можно подробнее про вариант с HashMap-ом?
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630761
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevHashMap чем не угодил ?у меня в HashMap и содержится список методов, этот список заполняется при запуске серверного приложения.
но как при помощи HashMap вызвать метод? и подставит ему данные?
с рефлексией просто.
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630763
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklopнет. у меня уже есть то что должно быть. Писал его я. Просто переписываю под модульность.у меня как раз и получается модульность.
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630764
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
можно подробнее про вариант с HashMap-ом?
...
Рейтинг: 0 / 0
Внутренний не статический класс. Верный подход? WebSocket
    #39630771
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklopвадя,
можно подробнее про вариант с HashMap-ом?для каждой страницы есть свои методы обработки данных.
их число не ограничивается.
для каждой страницы эти методы находятся в отдельном файле/классе
эти файлы находятся в отдельной папке
при запуске приложения - эти файлы обрабатываются и в HashMap заносится имя метода и весь путь до него
при получении сообщения из HashMap по имени метода/"команды" извлекается полный путь до метода и через рефлексию вызывается этот метод.
загрузка в HashMap написана один раз и давно. класс с обработкой ws тоже давний.
если мне надо добавить обработку я просто в нужный файл/класс (относящийся к нужной странице) добавляю метод и всё.
...
Рейтинг: 0 / 0
25 сообщений из 61, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Внутренний не статический класс. Верный подход? WebSocket
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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