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