为什么Guava事件总线(模块)不可扩展?

时间:2015-01-23 06:58:08

标签: java guava event-bus

在最新版本(以及之前版本)中,Guava eventbus模块不可扩展。目前,它在内部使用Subscriber和SubscriberRegistry来决定调度事件。但是这些类是包私有的,因此不可扩展。如果将SubscriberSubscriberRegistry设为公共界面,则会让其他人在决定Subscriber时提供自己的实现。

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

如果我有class Aclass B extends A以及class C extends Bclass D extends A,则可以创建/更新/删除A,B,C和D中的每一个。然后我必须为所有类ACreatedEventAUpdatedEventADeletedEventBCreatedEventBUpdatedEventBDeletedEvent等等。 (我知道如果发布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
}

并且我只需要为基类(EventACreatedEventAUpdatedEvent)和对其特别感兴趣的听众提供三个ADeletedEvent类子类事件可以有@Requires注释。

但问题是,Guava没有公开这些核心类。

所以,我的问题是:

  1. 为什么Guava希望订阅者的逻辑是私有的?
  2. 我正在研究商业产品。我可以将eventbus模块复制到我的代码库中,并为SubscriberSubscriberRegistry提供我自己的实现(一个新的实现而不更改现有的实现),并将EventBus更改为使用my {{ 1}}课程? (不更改其他类及其版权声明)是否会违反Apache License 2.0?
  3. [PS:对不起这个长问题。 SubscriberRegistry只是一个例子。问题的想法是@Requires]

    可能的可扩展行为

0 个答案:

没有答案