У меня есть код, похожий на это во всех моих классах наблюдателей, которые обрабатывают события, запущенные классом шины событий. Как вы можете видеть, существует множество проверок instanceof для выбора пути действия, необходимого для надлежащего управления событиями, и мне было интересно, можно ли это сделать более чисто, исключив тесты instanceof?Чистое управление событиями
@Override
public void handleEvent(Event event) {
if (event instanceof DownloadStartedEvent) {
DownloadStartedEvent dsEvent = (DownloadStartedEvent)event;
dsEvent.getDownloadCandidateItem().setState(new BusyDownloadingState());
} else if (event instanceof DownloadCompletedEvent) {
DownloadCompletedEvent dcEvent = (DownloadCompletedEvent)event;
dcEvent.getDownloadCandidateItem().setState(new FinishedDownloadingState());
DownloadCandidate downloadCandidate = dcEvent.getDownloadCandidateItem(). getDownloadCandidate();
if (downloadCandidate.isComplete()) {
// start extracting
}
} else if (event instanceof DownloadFailedEvent) {
DownloadFailedEvent dfEvent = (DownloadFailedEvent)event;
dfEvent.getDownloadCandidateItem().setState(new FailedDownloadingState());
}
}
Это чистый, объектно-ориентированный способ сделать это. Другие способы будут использовать параметр события с водопада-переключателем .. почему, по-вашему, это не ясно? – Jack
@Jack Это кошмар для обслуживания, если вы планируете добавить больше событий позже: всегда будет одно событие, за которое вы забыли проверить. – jqno
, если у вас много событий, это будет кошмар обслуживания в любом случае до тех пор, пока вы не придадите событиям обычное поведение в классах предков, а не разделяете их. Фактически это, когда number_events> a_considerable_amount вы будете ругаться в любом случае:/ – Jack