Лучшая практика - Объявление события как части интерфейса Java - PullRequest
4 голосов
/ 29 августа 2011

Я пытаюсь отделить некоторый код пользовательского интерфейса с помощью интерфейсов и событий, и я хотел бы знать, есть ли способ / лучшие практики в Java для объявления события как части интерфейса Java - что-то вроде того, что обеспечивает C #:

// C# event declaration in interface
public interface IAction
{
    event EventHandler OnAction;
}

Моя цель - просто пометить интерфейс таким образом, чтобы он (разработчики) запускал события определенного типа. Я надеюсь, что смогу включить не только документацию только для обеспечения такого поведения. Я понимаю, что Java не предоставляет ключевое слово «событие» или прямой способ сделать это, поэтому я надеюсь получить несколько советов по поводу обходного пути или наилучшей практики для достижения этой цели.

Один из способов сделать это - создать универсальный интерфейс маркера, который представляет возможность запуска событий:

public interface FiresEvent<T extends Event> {
    public void fireEvent();
}

... а затем наследовать этот интерфейс в моем пользовательском интерфейсе.

public interface MyInterface extends FiresEvent<ActionEvent> {

}

Проблема с этим подходом заключается в том, что «FiresEvent» может быть унаследовано только один раз, даже если универсальный тип изменяется, поэтому решение не кажется достаточно универсальным для случая, когда объект может быть источником множества событий.

Мне было бы любопытно узнать, как люди справятся с этим, и если есть лучший способ, чем просто документировать необходимость инициировать события.

EDIT: Может быть, следующее прояснит мой вопрос:

Я понимаю подход к списку обработчиков Java и самостоятельную обработку, позволяя вызывающим абонентам регистрировать обработчики для объекта. В моем случае я полагаюсь на шину событий, поэтому мы можем рассматривать «запускающие» события как их вывод, для чего-то еще, чтобы перенаправить на обработчики.

Я бы хотел определить ответственность интерфейса как:

  • Реализатор интерфейса запускает событие типа T в мир / шину событий / что угодно
  • Разработчику интерфейса не нужно делегировать самим зарегистрированным слушателям

Ответы [ 3 ]

4 голосов
/ 29 августа 2011

Java обрабатывает события немного иначе, чем вы привыкли, однако концепция та же самая. Вы создаете так называемый слушатель события, и он вызывается, когда событие происходит. Это может быть лучшей конструкцией, поскольку она позволяет регистрировать несколько слушателей.

Я предлагаю просмотреть этот учебник

2 голосов
/ 29 августа 2011

Это похоже на естественное место для использования аннотаций.Я встречал EventBus , который использует аннотации для публикации и подписки на события.Этот подход, естественно, самодокументируется и в зависимости от того, как он реализован, может сделать ваш код более читабельным и, возможно, позволит вам применить аннотацию.

2 голосов
/ 29 августа 2011

Наличие метода

 registerXListener(XListener listener)

в интерфейсе указывает, что класс будет отправлять XEvents тем, кто заботится.То есть «маркер» - это просто другой метод.Ближайший аналог идиомы C # (я думаю) должен был бы поднять этот метод в интерфейс, например

public interface XEventFirer 
{
    public void registerXListener(XListener listener)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...