在最新版本(以及之前版本)中,Guava eventbus模块不可扩展。目前,它在内部使用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
等等。但是可能有听众对子类对象事件特别感兴趣而不是超类对象事件。因此,为了给听众提供灵活性,这个膨胀的事件层次结构是必要的。
这迫使我创建了很多非常笨拙的Event类。我想的是,引入另一个注释,比方说@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
更改为使用my {{ 1}}课程? (不更改其他类及其版权声明)是否会违反Apache License 2.0? [PS:对不起这个长问题。 SubscriberRegistry
只是一个例子。问题的想法是@Requires
]