4

在最新版本(以及以前的版本)中,Guava eventbus 模块不可扩展。目前,它使用订阅者和SubscriberRegistry内部来决定调度事件。但是这些类是包私有的,因此不可扩展。如果SubscriberSubscriberRegistry被制作为公共接口,它将让其他人在决定Subscriber.

让我解释一下我的用例,以便在这里更有意义。可以说我有一个层次结构的类,它们有一组共同的事件(创建/更新/删除)。并且有听众为这些类中的一个或多个收听这些事件中的一个或多个。为了能够使用EventBus模型,现在,我必须为每种类型的类创建三个事件类。

如果我有class Aandclass B extends Aclass C extends Band class D extends A,则可以创建/更新/删除 A、B、C 和 D 中的每一个。然后我必须为所有课程设置ACreatedEvent, AUpdatedEvent, ADeletedEvent, BCreatedEvent, BUpdatedEvent, BDeletedEvent, 等等。(我知道如果发布,假设等等,订阅ACreatedEvent将被通知。但是可能有听众对子类对象事件而不是超类对象事件特别感兴趣。所以,这个臃肿的事件层次结构是必要的为听众提供灵活性)。BCreatedEventBCreatedEvent 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 没有公开这些核心类。

所以,我的问题是:

  1. 为什么 Guava 想要订阅者的逻辑私有?
  2. 我正在开发一个商业产品。我可以将 eventbus 模块复制到我的代码库中并提供我自己的实现(一个新的实现而不更改现有的实现)SubscriberSubscriberRegistry更改EventBus使用我的SubscriberRegistry类吗?(不更改其余类及其版权声明)这会违反 Apache License 2.0 吗?

[PS:对不起这个长长的问题。@Requires只是一个例子。这个问题的想法是可能的可扩展行为@Subscribe]

4

0 回答 0