Как организовать Java код и избежать switch конструкций при передаче объекто

Пишу клиент-серверное приложение на ЯП Java. Для передачи данных использую библиотеку KryoNet. суть вопроса - когда передаю некоторые данные (в виде общего Класса) с клиента на сервер или наоборот они обобщаются до типа Object, следовательно на принимающей стороне мне нужно эти данные привести вновь к тому-же типу и использовать Instance со switch'ами не вариант, т.к. таких классов множество, какие паттерны можно использовать для организации кода без switch`ей и условных операторов, или как можно организовать код.

public class RegistrationData {
public  enum Code{
    EMAIL_EXIST,
    LOGIN_EXIST,
    SUCCESS;
}

public class Response{
    public Code code;
    public Response(Code code) {
        this.code = code;
    }
}
public class Request{
    public String login;
    public String email;
    public String password;

    public Request(String login, String email, String password) {
        this.login = login;
        this.email = email;
        this.password = password;
    }
}

}

Пример одного из таких классов - сервер получает Request должен на его основе ,после запросов из БД, сформировать Response.

public void received(Connection c, Object p){
        //Проверяем какой отправляется пакет 
        if(p instanceof PacketMessage){
            //Если мы получили PacketMessage .
            PacketMessage packet = (PacketMessage) p; 
            System.out.println("Ответ от сервера: "+packet.message);
            
            //Мы получили сообщение
            messageReceived = true;
        }
    } 

public class PacketMessage {
    String message;
    }

из статьи


Ответы (1 шт):

Автор решения: Roman Konoval

В kryonet можно использовать типизированные обработчики если использовать не Listener а ReflectionListener.

То есть в том же примере вместо:

public class ServerProgram extends Listener {
    ...
}

делайте так:

public class ServerProgram extends Listener.ReflectionListener {
    ...
}

И тогда вместо нетипизированного обработчика создавайте типизированный:

public void received(Connection c, PacketMessage packet){
   System.out.println("Ответ от сервера: "+packet.message);
            
   //Мы получили сообщение
   messageReceived = true;
} 

ReflectionListener сам вызовет правильный метод в зависимости от типа объекта, который получен.

→ Ссылка