【问题标题】:How to implement language level events similar to C# in Java如何在 Java 中实现类似于 C# 的语言级事件
【发布时间】:2014-01-27 05:45:15
【问题描述】:

C# 有events on a language level 的概念,使用保留关键字eventdelegate 来定义发布者和订阅者方法。一直是asked if Java has native support for that,但答案显然是否定的。有several alternatives,其中包括使用 AWT/Swing 样式的事件、构建我自己的 Observer pattern 或使用其他发布/订阅方式。这是可能的,但正如一个答案所说,“只是需要更多的跑腿。”

一般来说,任何实现都遵循相同的类型化方法并且可以自动化。 Java 有不同的元编程机制,例如AOP 或 AST 转换。如何在 Java 中实现 C# 事件以尽可能减少“跑腿”?

也许Project Lombok

【问题讨论】:

  • 顺便说一句,别忘了你需要支持MultiCastDelegate 并且能够使用The + Operator 或类似的方式组合代表。
  • 是的,我知道它可以多播,但不必是 + 运算符 - 显然支持不会是语言级别的。
  • 我一直在想这个问题,编写 android 应用程序,我真的不喜欢匿名回调接口,而且所有的内联(尤其是我没有写的那些)都是一大堆我相信
  • @PeterKofler 老兄,java 落后了 15 年,而 C# 无处不在。有 Mono、Xamarin for Android、iOS、OSX 等等。为了使 java 成为一种体面的语言,您需要付出的努力远远超过 1000 美元的 Xamarin 许可证。获得其中之一并永远忘记 java
  • @Zefnus 不要忘记LINQasync/awaittype inferencereal propertiesextension methods 和真正的泛型,而不是奇怪的“类型擦除”东西。更不用说upcoming features 之类的单子空值检查...

标签: c# java events porting


【解决方案1】:

如果您有分布式环境,请使用Akka

否则你有几个选择

番石榴有EvenBus。 Guava 会是我的选择,因为它已经成为 Java 项目使用的核心库之一,如 apache commons、slf4j 等。

Google 搜索“java 事件库”显示更多选择。

否则,编写一个类来保存订阅者并在事件进入时将它们分派给他们。简单,但要小心并发。

【讨论】:

  • "easy" - 直到你发现 C# 通过引入委托使所有这些都变得毫无用处,这减少了 90% 的样板文件,使 java 看起来像孩子的东西,即使有番石榴的东西。 OP 显然正在寻找类似高质量 (C#) 的解决方案,除非语言、编译器和可能的虚拟机更新到本世纪的标准,否则 java 中完全不存在这种解决方案。
  • 这可能不会发生,因为有人决定他们需要保持“向后兼容性”,这太荒谬了。想象一下,如果其他人都这样做,并且 Windows 8 必须支持 D.O.S 1.0 的东西......我们仍然会在命令行中输入并且互联网将不存在。
  • 这些问题是这个问题的意图是什么:赞美C#ro学习如何在Java中做同样的事情。你可以反驳说图书馆可以做的事情不应该进入语言的语法。我不是说这是否正确。我只是在回答如何在 Java 中做到这一点的问题。
  • 我不确定 Java 是否保持向后兼容性,因为每个下一个版本都不会在以前的 JRE 上运行。
  • 我认为您是 not 回答这个问题,因为 OP 已经明确表示他已经知道 java 的复杂“解决方案”,但正在寻找更优雅、更漂亮 (C#) 的解决方案.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多