Il mio livello/vista dell'applicazione ha un sistema di invio eventi noto anche come lavagna. In esso gli ascoltatori sono memorizzati da una hashmap con chiavi che sono tipi di eventi implementati come un enum EventType e valori che sono i riferimenti listener che ascoltano questo tipo di evento. Per esempio. un oggetto modello sta ascoltando il tipo di evento "LOCAL_PLAYER_INPUT", processi di lavagna e notifica al giocatore poiché il giocatore implementa l'interfaccia EventHandler.Gestione eventi incapsulata con Enum
Vorrei disaccoppiare ulteriormente il mio modello implementando una lavagna standalone per modello. Verrà quindi aggiunto come listener alla lavagna del livello dell'applicazione poiché il livello dell'applicazione sta rilevando l'I/O da tastiera o touch. La lavagna modello di per sé delegherà ulteriormente gli eventi. Per questo ho voluto creare una gerarchia enum dove l'evento è classificato in questo modo:
MODEL.LOCAL.PLAYER_INPUT
modello sarebbe registrato come ascoltatore in vista lavagna solo passando modello come questo:
addListener(model.blackboard, MODEL); //Types: (EventHandler, EventType)
By combinando le interfacce con le enumerazioni che ho raggiunto, posso scrivere eventtype come MODEL.XY ma non sarà accettato da addListener sebbene MODEL stia implementando l'interfaccia EventType.
Cosa devo fare?
EDIT: Alcuni più codice
addListener Metodo:
public void addListener(EventHandler handler, EventType eventType) {
getListener(eventType).add(handler);}
private Array<EventHandler> getListener(EventType eventType) {
if(map.containsKey(eventType))
return map.get(eventType);
else {
Array<EventHandler> tmp = new Array<EventHandler>(false, 1, EventHandler.class);
map.put(eventType, tmp);
return tmp;
}
}
enumerazioni:
public interface WL extends EventType {
public static enum LOCAL {
PLAYER_INPUT,
NPC_INPUT
}
}
GameEvent:
public GameEvent(EventType eventType, Object message) {
this.eventType = eventType;
this.message = message;
timeStamp = System.currentTimeMillis();
}
Poiché le tue chiavi sono enumerate, dovresti prendere in considerazione l'uso di un 'EnumMap'. Anche se credo che questo non sia davvero un aspetto critico qui – fge
Questo è un bel consiglio, lo implementerò, grazie! –
Qualche altro codice sarebbe utile. Come appare il tuo enum, di cosa si lamenta il compilatore? – lost