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