TypeSafe EventDispatcher с данными в Java - PullRequest
2 голосов
/ 04 июля 2019

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

public interface EventDispatcher {
    <T> void registerCallback(Event<T> event, BiConsumer<T, Long> callback);
    <T> void event(Event<T> event, T t, long param);
}

и

public interface Event<T> {
    String name();
}

Это на самом деле работает (у меня есть рабочая реализация интерфейса EventDispatcher), интерфейс Event может быть «реализован»используя перечисления следующим образом:

public enum StringEvent implements Event<String> {
    EVENT1,
    EVENT2
}

Меня не устраивает тот факт, что мне нужно создавать разные перечисления для всех объектов, которые я хочу доставить диспетчеру.Я думал о чем-то вроде этого

public enum Events {
    EVENT1(String.class),
    EVENT2(String.class),
    EVENT3(Long.class);

    Events(Class<T> clazz) {
        ...
    }

    ...
}

Но, похоже, это не приводит к объекту события, который можно использовать в диспетчере событий ... Есть идеи?

1 Ответ

0 голосов
/ 05 июля 2019

Мой лучший подход до сих пор:

public class Events {
    private static <T> Event<T> create(String name) {
        return () -> name;
    }

    public static final Event<String> EVENT1 = create("Event1");
    public static final Event<String> EVENT2 = create("Event2");
    public static final Event<Long> EVENT3 = create("Event3");
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...