В настоящее время я реализую асинхронную очередь событий внутри моего приложения - она разработана для работы следующим образом: один компонент реагирует на ввод данных пользователем и помещает событие в очередь, а другой «слушатель» проверяет, есть ли событиеопределенного типа внутри очереди и запускает свою собственную бизнес-логику
. Могут быть различные типы событий (например, USER_MOUSE_CLICK, USER_KEYBOARD_CLICK и т. д.), и каждая реализация имеет свой собственный тип «объект-событие»
Этовыглядит так (я опускаю конструкторы - устанавливаю все поля и методы получения / установки - они просто обычные значения по умолчанию):
public abstract MyEvent<T> {
private EventType eventType;
private T eventData;
}
public MouseClickEvent extends MyEvent<ClickPoint> { // ClickPoint class contains x,y of mouse click
public MouseClick(ClickPoint point) {
super(EventType.USER_MOUSE_CLICK, point);
}
}
public KeyboardClickEvent extends MyEvent<String> { // character that has been clicked on keyboard
public MouseClick(String key) {
super(EventType.USER_KEYBOARD_CLICK, key);
}
}
У меня также есть служба с очередью MyEvent
экземпляров и методомчтобы получить первое событие из предоставленного EventType
, если оно существует - это похоже на
...
private List<MyEvent> queue;
...
public MyEvent fetchMyEvent(EventType eventType) {
for(MyEvent event : queue) {
if(event.getEventType().equals(eventType) {
return event;
}
}
return null;
}
...
Проблема в том, что когда я пытаюсь получить событие, мне нужно привести его к конкретной реализации, такой как
// some listener logic
MouseClickEvent event = (MouseClickEvent ) eventService.fetchMyEvent(EventType.USER_MOUSE_CLICK);
log("The X point of mouse click was: " + event.getEventData().x);
Мне не нравится этот кастинг - я чувствую, что у меня нет контроля над типами, когда я получаю дажеи я вижу эту ситуацию как «слабое место» и генератор ошибок.Есть какой-то шаблон проектирования, чтобы избежать этого, или я должен перепроектировать всю систему?Или, может быть, это единственный путь, и мне все равно