Я также думал об общей структуре событий, управляемой аннотациями. Мне нравятся преимущества, предоставляемые статической типизацией, но текущая модель событий, управляемая интерфейсом, является болезненной для использования (ужасный код). Можно ли будет использовать пользовательский процессор аннотаций для проверки во время компиляции? Это может помочь добавить некоторую недостающую «безопасность», к которой мы все привыкли.
Большая часть проверки ошибок также может быть выполнена в то время, когда слушатели «зарегистрированы» у производителей событий. Таким образом, приложение может выйти из строя рано (при регистрации слушателей), возможно, даже во время запуска.
Вот пример того, как может выглядеть универсальная структура, с которой я играю:
public class ExampleProducer {
private EventSupport<ActionEvent> eventSupport;
public ExampleProducer() {
eventSupport = new EventSupport<ActionEvent>(this);
}
@AddListenersFor(ActionEvent.class)
public void addActionListener(Object listener)
{
eventSupport.addListener(listener);
}
@RemoveListenersFor(ActionEvent.class)
public void removeActionListener(Object listener)
{
eventSupport.removeListener(listener);
}
public void buttonClicked() {
eventSupport.fire(new ActionEvent(this,
ActionEvent.ACTION_PERFORMED, "Click"));
}
}
Производитель использует EventSupport
, который использует отражение для вызова событий. Как упоминалось ранее, EventSupport
может предварительно выполнить некоторые начальные проверки при регистрации прослушивателей событий.
public class ExampleListener
{
private ExampleProducer submitButton;
public ExampleListener()
{
submitButton = new ExampleProducer();
EventSupport.autoRegisterEvents(this);
}
@HandlesEventFor("submitButton")
public void handleSubmitButtonClick(ActionEvent event)
{
//...some code to handle the event here
}
}
Здесь EventSupport
имеет статический метод, который использует отражение для автоматической регистрации прослушивателя у источника событий. Это устраняет необходимость вручную регистрироваться в источнике событий. Пользовательский процессор аннотаций может использоваться для проверки того, что аннотация @HandlesEventFor
ссылается на фактическое поле ExampleListener
. Обработчик аннотаций может также выполнять другие проверки, например, гарантировать, что сигнатура метода обработчика событий совпадает с одним из методов регистрации на ExampleProducer
(в основном, такая же проверка, которая может быть выполнена во время регистрации). *
Что вы думаете? Стоит ли тратить время на полное развитие?