Ho intenzione di utilizzare una coda messaggi per le comunicazioni tra un motore di gioco e un server di gioco. Questo dovrebbe permettermi di scrivere entrambi senza dipendenze dirette tra loro.
L'esempio che userò in questa domanda è un DisconnectMessage
. Un server può inviare un DisconnectMessage
al motore se, ad esempio, il client ha superato il valore di timeout e non ha risposto a una richiesta ping. Il motore può anche inviare DisconnectMessage
al server se, ad esempio, un operatore del server emette un comando kick
per un giocatore. In entrambi i casi, il giocatore viene salvato nel repository del giocatore del gioco.
Quindi quello che ho al momento è un server, un motore di gioco e due code di messaggi (uno per l'entrata, uno per l'uscita).
Per ora, quello che mi piacerebbe avere è un'istanza di un gestore di messaggi sicuro per ogni tipo di messaggio. È qui che il problema è per me, poiché non riesco a ottenere un gestore specifico per un messaggio generico.
Il codice che ho è qualcosa del tipo:
public interface GameMessage {
}
public interface GameMessageHandler<T extends GameMessage> {
public void handle(T message);
}
public class DisconnectMessage implements GameMessage {
// ...
}
public class DisconnectMessageHandler implements GameMessageHandler<DisconnectMessage> {
@Override
public void handle(DisconnectMessage message) {
// ... something something
}
}
public class GameEngine implements Runnable {
public GameEngine(Queue<GameMessage> in, Queue<GameMessage> out) {
// ...
}
@Override
public void run() {
if (!in.empty()) {
GameMessage message = in.poll();
handle(message);
}
}
}
Il metodo corrente che ho (che non funziona) è il seguente
// in GameEngine
public <T extends GameMessage> void handle(T message) {
GameMessageHandler<T> handler = getHandler(message.getClass());
handler.handle(message);
}
public <M extends Message, H extends GameMessageHandler<M>> H getHandler(Class<M> messageClass) {
// get handler somehow from a dictionary
}
Tuttavia, il sistema di tipi di Java non mi consente di ottenere ciò in questo modo.
C'è un modo per ottenere un gestore di messaggi concreto dalla classe di interfaccia di base?
O forse una domanda diversa che potrebbe cambiare la risposta; esiste un modo diverso / migliore rispetto all'utilizzo di una coda messaggi per impedire una dipendenza circolare?