在最新版本(以及以前的版本)中,Guava eventbus 模块不可扩展。目前,它使用订阅者和SubscriberRegistry
内部来决定调度事件。但是这些类是包私有的,因此不可扩展。如果Subscriber
和SubscriberRegistry
被制作为公共接口,它将让其他人在决定Subscriber
.
让我解释一下我的用例,以便在这里更有意义。可以说我有一个层次结构的类,它们有一组共同的事件(创建/更新/删除)。并且有听众为这些类中的一个或多个收听这些事件中的一个或多个。为了能够使用EventBus
模型,现在,我必须为每种类型的类创建三个事件类。
如果我有class A
andclass B extends A
和class C extends B
and 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
(可能使用 a 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 没有公开这些核心类。
所以,我的问题是:
- 为什么 Guava 想要订阅者的逻辑私有?
- 我正在开发一个商业产品。我可以将 eventbus 模块复制到我的代码库中并提供我自己的实现(一个新的实现而不更改现有的实现)
Subscriber
并SubscriberRegistry
更改EventBus
使用我的SubscriberRegistry
类吗?(不更改其余类及其版权声明)这会违反 Apache License 2.0 吗?
[PS:对不起这个长长的问题。@Requires
只是一个例子。这个问题的想法是可能的可扩展行为@Subscribe
]