为什么 Guava eventbus(模块)不可扩展?

2024-02-06

在最新版本中(以及之前的版本中),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 并没有公开那些核心类。

所以,我的问题是:

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

[PS:抱歉问了这么长的问题。@Requires这只是一个例子。这个问题的想法是可能的可扩展行为@Subscribe]


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Guava eventbus(模块)不可扩展? 的相关文章

  • NoInitialContextException:heroku 战争部署

    我一直在开发一个 J2EE 项目 并且在其中使用连接池 也通过部署在 heroku 上的数据库进行访问 我使用以下代码来设置 Connection 对象 Context initContext new InitialContext Cont
  • “java.io.IOException:连接超时”和“SocketTimeoutException:读取超时”之间有什么区别

    如果我设置一个套接字 SoTimeout 并从中读取 当读取时间超过超时限制时 我会收到 SocketTimeoutException 读取超时 这是我的例子中的堆栈 java net SocketTimeoutException Read
  • 获取文件的锁

    我想在对特定文件开始 threo read 时获取文件上的锁定 以便其他应用程序无法读取已锁定的文件并希望在线程终止时释放锁定文件 您可以获得一个FileLock https docs oracle com javase 8 docs ap
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • 如何强制jar使用(或jar运行的jvm)utf-8而不是系统的默认编码

    我的Windows默认编码是GBK 而我的Eclipse完全是utf 8编码 因此 在我的 Eclipse 中运行良好的应用程序崩溃了 因为导出为 jar 文件时这些单词变得不可读 我必须在 bat 文件中写入以下行才能运行该应用程序 st
  • Base36 编码字符串?

    我一直在网上查找 但找不到解决此问题的方法 在 Python Ruby 或 Java 中 如何对以下字符串进行 Base 36 编码 nOrG9Eh0uyeilM8Nnu5pTywj3935kW 5 Ruby 以 36 为基数 s unpa
  • 如何将jscrollpane添加到jframe?

    我有以下源代码 有人可以给我建议如何将 jscrollpane 添加到 jframe 上吗 我尝试了几次将其添加到 jframe 但没有任何进展 它甚至没有显示 public class Form3 JFrame jframe new JF
  • 埃拉托色尼筛法 - 实现返回一些非质数值?

    我用 Java 实现了埃拉托斯特尼筛法 通过伪代码 public static void sieveofEratosthenes int n boolean numArray numArray new boolean n for int i
  • 您建议使用哪种压缩(GZIP 是最流行的)servlet 过滤器?

    我正在寻找一个用于大容量网络应用程序的 GZIP servlet 过滤器 我不想使用容器特定的选项 要求 能够压缩响应负载 XML Faster 已在大批量应用的生产中得到验证 应适当设置适当内容编码 跨容器移植 可选择解压缩请求 谢谢 我
  • Eclipse - 安装新的 JRE (Java SE 8 1.8.0)

    我正在尝试安装 Java 8 到目前为止我所做的 安装最新版本的 Eclipse 下载并安装 Java SE 运行时环境 8http www oracle com technetwork java javase downloads jre8
  • 在 Java 中通过 XSLT 分解 XML

    我需要转换具有嵌套 分层 表单结构的大型 XML 文件
  • 用于缓存的 Servlet 过滤器

    我正在创建一个用于缓存的 servlet 过滤器 这个想法是将响应主体缓存到memcached 响应正文由以下方式生成 结果是一个字符串 response getWriter print result 我的问题是 由于响应正文将不加修改地放
  • 我们如何测试包私有类?

    我正在看书Effective Java in Item 13 Minimize the accessibility of classes and members 它提到 为了方便测试 您可能想让类 接口或成员更易于访问 这在某种程度上是好的
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 如何处理 StaleElementReferenceException

    我正在为鼠标悬停工作 我想通过使用 for 循环单击每个链接来测试所有链接的工作条件 在我的程序中 迭代进行一次 而对于下一次迭代 它不起作用并显示 StaleElementReferenceException 如果需要 请修改代码 pub
  • Hadoop NoSuchMethodError apache.commons.cli

    我在用着hadoop 2 7 2我用 IntelliJ 做了一个 MapReduce 工作 在我的工作中 我正在使用apache commons cli 1 3 1我把库放在罐子里 当我在 Hadoop 集群上使用 MapReduceJob
  • 使用 JFreeChart 为两个系列设置不同的 y 轴

    我正在使用 JFreeChart 使用折线图绘制两个数据系列 XYSeries 复杂的因素是 其中一个数据系列的 y 值通常远高于第二个数据系列的 y 值 假设第一个系列的 y 值约为数百万数量级 而第二个数据系列的 y 值约为数百万数量级
  • ArrayList.clear() 和 ArrayList.removeAll() 有什么区别?

    假如说arraylist定义为ArrayList

随机推荐

  • Swift - 如何在单击时使图像全屏显示,然后在再次单击时使图像变为原始大小? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 对于我正在制作的应用程序 我希望用户能够单击图像以使其在应用程序上全屏显示 然后用户可以单击现在的全屏图像以使其恢复原始大小 这可能吗
  • 我不明白 format() 和 ... (python) 之间有什么区别

    这里是困惑的新手 使用有什么区别 print So you are 0 years old format age AND print So you are age years old 两者都有效 其实差别很大 前者使用字符串format h
  • 汇编中的纯高位乘法?

    为了实现 0 到 1 之间的实数 通常使用 ANSI 浮点数或双精度数 但是 0 到 1 之间的固定精度数字 小数模 1 可以有效地实现为 32 位整数或 16 位字 它们像普通整数 字一样相加 但乘以 错误的方式 这意味着当您乘以 X 倍
  • gem 服务器:如何更新缺少 rdoc 的 gem?

    我很喜欢gem server使用本地 RubyGems 文档索引引导 Web 服务器的命令 我唯一的问题是 有些 gems 没有 rdoc 文件 如何添加缺失的rdoc 所有gem都是主流gem 不是我自己的 通过Bundler安装 导轨2
  • 电子生成器应用程序大小太大

    我发现使用 Electron builder 生成的 MyApp exe 文件有将近 500M 左右 我不确定我做了什么 因为以前 仅对于 ia32 或 x64 它大约是 196M 我也看了这个link https stackoverflo
  • 矢量上的段错误

    我创建了一个结构来保存一些数据 然后声明一个向量来保存该结构 但是当我执行 Push back 时 我遇到了该死的段错误 我不知道为什么 我的结构定义为 typedef struct Group int codigo string name
  • 查找最大值并显示 SQL Server 中不同字段的相应值

    我有一个表 其中包含有关城市的数据 其中包括城市名称 人口和与我的问题无关的其他字段 ID Name Population 1 A 45667 2 B 123456 3 C 3005 4 D 13769 找到最大人口是基本的 但我需要一个结
  • python 在 x 轴上旋转值以不重叠

    I m having some problems with the xticks of the graph here 有人可以帮忙吗 我尝试了他们在这里所做的事情 matplotlib 中的日期刻度和旋转 https stackoverfl
  • 如何设置 Facebook 分享图片(仅作为后备)?

    我们当然可以使用以下命令来设置默认共享图像 但是 有没有办法将其设置为仅后备 而不是默认值 这意味着 只有当 Facebook 无法从博客文章中找到更大 更合适的图像时才可以使用 注意 Facebook 已经自动自行抓取 无需网站所有者的任
  • tensorflow-gpu 无法与 Blas GEMM 一起使用 启动失败

    我安装了tensorflow gpu 以在GPU 上运行我的tensorflow 代码 但我无法让它运行 它不断给出上述错误 以下是我的示例代码 后面是错误堆栈跟踪 import tensorflow as tf import numpy
  • Django 不允许的主机

    我刚刚开始第一次接触 Django 所以我创建一个 django 项目并运行命令 python3 manage py runserver 0 0 0 0 8000 我没有得到预期的 django 主页 而是收到以下错误消息 Disallow
  • 未使用模板专业化

    我定义了以下函数 template
  • Swift 中有多少种编写闭包的方法?

    问题 在 swift 中编写任何闭包时需要考虑哪些基本规则和边界 就语法而言 闭包有多种类型 我们可以使用带有 void return 单参数返回和多返回类型的闭包 我们可以用inout typealaise escaping autocl
  • 正确使用 JavaScript 接口关键字

    首先 不 我并不想为我的 JavaScript 代码创建任何类似 Java 的接口 我到处都见过这些问题 虽然我对 JavaScript 来说还是个相对新手 但我知道这些不是该语言的一部分 不过 我很好奇它的实际用途是什么interface
  • Inno Setup:如果程序文件夹中存在文件,则关闭安装程序向导

    我正在尝试创建一个演示安装程序 如果它检测到该文件close txt在程序文件夹中 然后它会关闭向导或中止安装 我正在运行一个计划任务 该任务会在两天后自动卸载该应用程序 初次安装时close txt文件安装在程序文件夹中 然后自动卸载后c
  • 了解 Nest 中的 Inject、Injectable 和 InjectRepository

    我来自非打字稿和非巢背景 我正在检查代码 发现了这段代码片段 import Inject Injectable from nestjs common import InjectRepository from nestjs typeorm i
  • ItextSharp 中的 Pdf 合并问题(合并后的 Pdf 不保留其值)

    我们正在尝试使用 ITextSharp 合并三个 PDF 问题是合并后我们只能从第一个 PDF 中获取数据 而其他两个 PDF 则不会保留其值 所有这些 PDF 都具有相同的结构 即它们使用具有不同数据的相同模板 因此我的假设是它们具有相同
  • 删除事件处理程序

    Is this Button Click new EventHandler Button Click 与此相同 Button Click Button Click 我问这个问题是因为在我看来 前者似乎正在删除对方法的新引用 而后者正在删除方
  • jQuery-检测 SPAN 字段内容的变化

    我有下面的代码用于模拟文本框
  • 为什么 Guava eventbus(模块)不可扩展?

    在最新版本中 以及之前的版本中 Guava eventbus 模块不可扩展 目前 它使用订阅者和SubscriberRegistry在内部决定调度事件 但这些类是包私有的 因此不可扩展 如果Subscriber and Subscriber