最佳实践 - 将事件声明为 Java 接口的一部分

2024-01-20

我正在尝试使用接口和事件来解耦一些 UI 代码,我想知道 Java 中是否有方法/最佳实践来将事件声明为 Java 接口的一部分 - 就像 C# 提供的那样:

// C# event declaration in interface
public interface IAction
{
    event EventHandler OnAction;
}

我的目标只是标记一个接口,以便知道它(实现者)会触发特定类型的事件。我希望我可以包含更多的文档来强制执行这种行为。我意识到 Java 没有提供“event”关键字或直接执行此操作的方法,因此我希望获得一些有关解决方法或实现此目的的最佳实践的建议。

我能想到的一种方法是创建一个通用标记接口来表示触发事件的能力:

public interface FiresEvent<T extends Event> {
    public void fireEvent();
}

...然后在我的自定义界面中继承该界面。

public interface MyInterface extends FiresEvent<ActionEvent> {

}

这种方法的问题在于“FiresEvent”只能继承一次,即使泛型类型发生变化,因此对于一个对象可能是多个事件源的情况,该解决方案似乎不够通用。

我很想知道人们会如何处理这个问题,以及是否有比仅仅记录触发事件的需要更好的方法。

EDIT:也许以下内容可以解答我的疑问:

我通过允许调用者针对对象注册处理程序来了解 Java 处理程序列表方法和自我处理。就我而言,我依赖于事件总线,因此我们可以将“触发”事件视为将它们放在那里,以便将其他事件重定向到处理程序。

我想将接口职责定义为:

  • 接口实现者将类型 T 的事件触发到世界/事件总线/任何事物中
  • 接口实现者不必委托给已注册的侦听器本身

Java 处理事件的方式与您习惯的稍有不同,但概念是相同的。您创建所谓的事件侦听器,并在事件发生时调用它。这可能是一个更好的构造,因为它允许注册多个侦听器。

我建议浏览这个tutorial http://download.oracle.com/javase/tutorial/uiswing/events/index.html

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

最佳实践 - 将事件声明为 Java 接口的一部分 的相关文章

随机推荐

  • 与串口“Verifone VX520”通信

    我正在通过串口将数据发送到 Verifone VX520 支付设备 这是我第一次尝试与此类设备进行通信 SerialObj Open 字符串输入 02hPUR 10 99 000000000004 634 4761739001010010F
  • XSL 用插入符替换空格

    更新的代码
  • 根据用户在 ASP.net 中的设置定期发送邮件?

    在我的网络应用程序中 我想根据用户自己预先选择的时间段为用户发送邮件 例如 每 3 天向用户 01 发送 1 封 HTML 邮件 每 20 天向用户 02 发送 1 封 HTML 邮件我怎样才能做到这一点 有资源吗 我可以通过我的应用程序从
  • com.hazelcast.nio.serialization.HazelcastSerializationException

    我正在运行一个 OSGI 插件项目 没有捆绑包 我在其中集成了 hazelcast 我 当我尝试将数据添加为字符串和测试 bean 的映射时 它被添加到淡褐色投射映射中 但是 二 当我尝试获取地图时 它显示错误如下 com hazelcas
  • Chrome扩展如何在扩展目录中写入文件

    这只是一个关于 chrome 扩展文件写入的简单问题 是否可以在chrome扩展目录中写入文件 我的意思是在我拥有清单文件和其他脚本的同一文件夹中写入一个文件 到目前为止 我发现我可以通过 XMLHttpRequest 读取目录中的文件 但
  • 关键点描述符 OpenCV

    我试图了解如何获取给定的描述符KeyPoint在 OpenCV 中 到目前为止 我的代码如下所示 include
  • Android Studio 和 Ryzen CPU?

    我知道它可能会被标记为重复 但没有一个线程对我有帮助 所以我决定自己做一个 I m a Java后端开发人员我决定学习一些 Android 的东西 几年前我在 Android Studio 工作过i5 4570处理器 然后我放弃了 现在我发
  • 使用 Entity Framework 和 Linq 进行动态排序

    我有另一个类似的问题在这里得到了回答 关于 NULL 值是订单的最后一个 在 Dynamic Linq Order By 上将 NULL 行保留在最后 https stackoverflow com questions 42277259 k
  • 我们如何使用 C# 将二进制数转换为八进制数?

    嘿 我正在开发一个应用程序 它将任何基数 如 2 8 10 16等 转换为用户所需的基数系统 我在将二进制数转换为八进制数时遇到问题 有人可以帮我吗 我尝试了一切 i am taking a binary number in value a
  • 在部署的应用程序上播放来自 s3 的文件时出现跨源资源策略问题

    我在 Heroku 上部署了一个应用程序 可以让我播放音频文件 你可以在这里查看https telecurve herokuapp com manage https telecurve herokuapp com manage 在我在 He
  • 使用 StoryBoards 时进行单元测试 cellForRowAtIndexPath

    如果我要从故事板中的标识符中取出单元格 如何以单元测试的方式调用 cellForRowAtIndexPath 并且不让单元格为零 UITableViewCell tableView UITableView tableView cellFor
  • OData WebApi V4 .net - 自定义序列化

    我需要创建一个序列化器来支持以下所有任务 删除空属性 删除空列表 我注意到的语法ODataMediaTypeFormatter已经变了 我在将序列化提供程序添加到管道时遇到问题 这是我尝试过的 在 WebApiConfig cs 上 var
  • gaierror: [Errno -2] 名称或服务未知

    def make req data url method POST params urllib urlencode data headers Content type application x www form urlencoded Ac
  • 从环境中删除除与给定模式匹配的对象之外的所有对象

    我正在尝试删除所有objects来自我的 RStudio环境其中对象名称不等于模式 rm list ls pattern may19 但这给了我一个错误 as environment pos 中的错误 没有名为 pattern may19
  • 如何处理 Spark SQL 上的 AnalysisException?

    我正在尝试在 Spark 中执行查询列表 但如果查询未正确运行 Spark 会抛出以下错误 AnalysisException 不支持更改表更改列 这是我的代码的一部分 我在 Databricks 上使用 python 和 Spark SQ
  • 在android中为ksoap2设置编码utf-8

    我对 ksoap2 有问题 我想在 android 中为 ksoap2 设置编码 utf 8 或者在标头中设置内容类型为 text xml charset utf 8 我的代码 设置编码 envelope encodingStyle utf
  • MS Edge - window.print() 与 MS Edge 中的框架上下文无关

    与其他浏览器相比 Microsoft Edge 处理 window print 的方式不一致 在大多数浏览器中 从页面上的 iframe 内调用 window print 只会打印该 iframe 的内容 然而 在边缘它总是会打印整个文档
  • python - 递归删除字典键?

    我正在使用 Python 2 7plistlib以嵌套字典 数组形式导入 plist 然后查找特定键并在我看到它的任何地方将其删除 当谈到我们在办公室处理的实际文件时 我已经知道在哪里可以找到这些值 但我编写脚本时的想法是我不知道 希望我不
  • 行动扩展和共享核心数据

    我在我的应用程序中使用操作扩展 我们的应用程序当前使用核心数据 我正在应用程序和 使用应用程序组的操作扩展并成功将核心数据从文档目录迁移到应用程序组 当使用扩展程序将照片或笔记从照片 笔记应用程序导入到我的应用程序时 我遇到的问题会发生 该
  • 最佳实践 - 将事件声明为 Java 接口的一部分

    我正在尝试使用接口和事件来解耦一些 UI 代码 我想知道 Java 中是否有方法 最佳实践来将事件声明为 Java 接口的一部分 就像 C 提供的那样 C event declaration in interface public inte