Тема: Java Event System
Показать сообщение отдельно
Старый 13.09.2015, 08:47   #1
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Java Event System

Всем привет.

Поработав в с#, я пристрастился к его системе событий
public event EventHandler<MyEventArgssomeEvent;
....
if (
someEvent != null) {
  
someEvent(this, new MyEventArgs(1"hi"));

Решил написать аналог для джавы (не искал подобные решения, просто хотел сам сделать).
В итоге - есть репозиторий, кому интересно, попробуйте.
Репозиторий в github

Что внутри
  • Event & SimpleEvent - объект "событие", который будет генерировать событие.
  • IEventListener - слушатель, который подписывается на собития и ловит их сигналы.
  • EventSystem - вспомогательный класс, который позволяет отписаться от всех слушателей у всех событий конкретного объекта, который нужно (например) удалить (вызывать отписку нужно вручную, зато всего 1 строчка).

Как использовать

Рекомендуется объявлять объекты событий как 'public final', т.е. создавать их при создании самого объекта, чтобы слушатели могли подписаться на них в любой момент.

public final Event<MyEventArgseventSomethingHappen EventSystem.newEvent(this); 
Если будете использовать EventSystem, то объект с событием должен включать интерфейс IWithEvents.
Этот интерфейс пока пустой, используется для единообразия (возможно, это лишнее, я пока не решил).

Можем подписаться на созданное выше событие и обработать его:

myObj.eventSomethingHappen.subscribe(listener);
...
private final 
IEventListener<MyEventArgslistenerForSomethingHappen = new IEventListener<MyEventArgs>() {
  @
Override
  
public void onReceived(Object senderMyEventArgs args) {
    
// достаём какие-то данные из args, если надо
    // что-то делаем
    // отписываемся от события, если надо
  
}
}; 
Когда объект с событиями нужно удалить, мы можем отписать все его события от всех слушателей всего 1й строкой кода (при условии, что события создавали через EventSystem)

EventSystem.remove(this); // удаление из системы событий, а не из памяти 
Перед закрытием приложения можно использовать отвязку событий всех объектов

EventSystem.removeAllObjects(); 

Последний раз редактировалось Жека, 13.09.2015 в 09:12. Причина: переименовал EventHandler в Event
(Offline)
 
Ответить с цитированием