Почему Guava eventbus (модуль) не является расширяемым?

В последней версии (и в предыдущих версиях тоже) модуль событийной шины Guava не является расширяемым. В настоящее время он использует Subscriber и SubscriberRegistry для внутреннего принятия решения об отправке события. Но эти классы сделаны пакетно-приватными и, следовательно, не расширяемыми. Если бы Subscriber и SubscriberRegistry были сделаны общедоступными, это позволило бы другим предоставлять свою собственную реализацию при выборе Subscriber.

Позвольте мне объяснить мой вариант использования, чтобы здесь было больше смысла. Допустим, у меня есть иерархия классов с общим набором событий (создание/обновление/удаление). И есть слушатели, которые слушают одно или несколько из этих событий для одного или нескольких из этих классов. Чтобы иметь возможность использовать модель EventBus, теперь мне нужно создать три класса событий для каждого типа классов.

Если у меня есть class A и class B extends A и class C extends B и class D extends A, и каждый из A, B, C и D может быть создан/обновлен/удален. Тогда у меня должны быть ACreatedEvent, AUpdatedEvent, ADeletedEvent, BCreatedEvent, BUpdatedEvent, BDeletedEvent и так далее для всех классов. (Я знаю, что подписка на ACreatedEvent будет уведомлена, если будет опубликовано BCreatedEvent, предполагая, что BCreatedEvent extends ACreatedEvent и так далее. Но могут быть слушатели, которые конкретно заинтересованы в событии объекта подкласса, а не в событии объекта суперкласса. Итак, эта раздутая иерархия событий необходимо, чтобы дать слушателям гибкость).

Это вынуждает меня создавать так много классов событий, что очень неуклюже. Я подумал о том, чтобы ввести еще одну аннотацию, скажем, @Requires(classTypes={B.class}), которую следует добавить вместе с @Subscribe. Этот вид вспомогательной/ассоциативной аннотации может затем использоваться при построении Subscriber/SubscriberRegistry (возможно, с использованием Predicate<Class>). В этом случае слушатели могли просто

/**
 * Listens for B or C created event
 */
@Subscribe
@Requires(classTypes={B.class, C.class})
public void handleCreatedEvent(ACreatedEvent event) {
    //handle B and C created event
}

и мне нужно было бы иметь только три класса Event для базового класса (ACreatedEvent, AUpdatedEvent, ADeletedEvent), а слушатели, которые особенно заинтересованы в событиях подкласса, могут иметь аннотацию @Requires.

Но проблема в том, что Guava не предоставляет эти основные классы.

Итак, мои вопросы:

  1. Почему Гуава хотел, чтобы логика подписчиков была закрытой?
  2. Я работаю над коммерческим продуктом. Могу ли я скопировать модуль шины событий в свою кодовую базу и дать свою собственную реализацию (новую реализацию без изменения существующей реализации) для Subscriber и SubscriberRegistry и изменить EventBus для использования моего класса SubscriberRegistry? (без изменения остальных классов и их заявлений об авторских правах) Будет ли это нарушать лицензию Apache 2.0?

[PS: Извините за этот длинный вопрос. @Requires это просто пример. Идея вопроса заключалась в возможном расширяемом поведении для @Subscribe]


person Amudhan    schedule 23.01.2015    source источник
comment
Короче говоря, потому что Гуава хотел иметь возможность изменить эту деталь реализации, не ломая всех, кто решил ее расширить.   -  person Louis Wasserman    schedule 23.01.2015
comment
Will that violate the Apache License 2.0? Нет, пока вы правильно замечаете изменения. Прочитайте пункт 4. Перераспределение.   -  person PeterMmm    schedule 23.01.2015
comment
Это не имеет особого смысла как вопрос StackOverflow (на самом деле нет ответа, кроме того, что сказал Луи), но имеет смысл как запрос функции. Отправьте проблему с описанием вашего варианта использования и почему текущего поведения недостаточно, и вы можете просто получить свое желание в последующем выпуске.   -  person dimo414    schedule 01.08.2016