В последней версии (и в предыдущих версиях тоже) модуль событийной шины 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 не предоставляет эти основные классы.
Итак, мои вопросы:
- Почему Гуава хотел, чтобы логика подписчиков была закрытой?
- Я работаю над коммерческим продуктом. Могу ли я скопировать модуль шины событий в свою кодовую базу и дать свою собственную реализацию (новую реализацию без изменения существующей реализации) для
Subscriber
иSubscriberRegistry
и изменитьEventBus
для использования моего классаSubscriberRegistry
? (без изменения остальных классов и их заявлений об авторских правах) Будет ли это нарушать лицензию Apache 2.0?
[PS: Извините за этот длинный вопрос. @Requires
это просто пример. Идея вопроса заключалась в возможном расширяемом поведении для @Subscribe
]
Will that violate the Apache License 2.0?
Нет, пока вы правильно замечаете изменения. Прочитайте пункт 4. Перераспределение. - person PeterMmm   schedule 23.01.2015