Java Event System
Всем привет.
Поработав в с#, я пристрастился к его системе событий
PHP код:
public event EventHandler<MyEventArgs> someEvent; .... if (someEvent != null) { someEvent(this, new MyEventArgs(1, "hi")); }
Решил написать аналог для джавы (не искал подобные решения, просто хотел сам сделать).
В итоге - есть репозиторий, кому интересно, попробуйте.
Репозиторий в github
Что внутри
- Event & SimpleEvent - объект "событие", который будет генерировать событие.
- IEventListener - слушатель, который подписывается на собития и ловит их сигналы.
- EventSystem - вспомогательный класс, который позволяет отписаться от всех слушателей у всех событий конкретного объекта, который нужно (например) удалить (вызывать отписку нужно вручную, зато всего 1 строчка).
Как использовать
Рекомендуется объявлять объекты событий как 'public final', т.е. создавать их при создании самого объекта, чтобы слушатели могли подписаться на них в любой момент.
PHP код:
public final Event<MyEventArgs> eventSomethingHappen = EventSystem.newEvent(this);
Если будете использовать EventSystem, то объект с событием должен включать интерфейс IWithEvents.
Этот интерфейс пока пустой, используется для единообразия (возможно, это лишнее, я пока не решил).
Можем подписаться на созданное выше событие и обработать его:
PHP код:
myObj.eventSomethingHappen.subscribe(listener); ... private final IEventListener<MyEventArgs> listenerForSomethingHappen = new IEventListener<MyEventArgs>() { @Override public void onReceived(Object sender, MyEventArgs args) { // достаём какие-то данные из args, если надо // что-то делаем // отписываемся от события, если надо } };
Когда объект с событиями нужно удалить, мы можем отписать все его события от всех слушателей всего 1й строкой кода (при условии, что события создавали через EventSystem)
PHP код:
EventSystem.remove(this); // удаление из системы событий, а не из памяти
Перед закрытием приложения можно использовать отвязку событий всех объектов
PHP код:
EventSystem.removeAllObjects();
|