【问题标题】:Java Events: Is this a good way to go about it?Java 事件:这是一个很好的方法吗?
【发布时间】:2009-01-16 23:08:26
【问题描述】:

我正在用 Java 重新实现一个 .Net API,该 API 指定了一大堆事件,ehich java 并不隐式支持。

我将使用观察者模式,但由于事件的数量,我真的不想弄乱界面。

我想知道声明一个“Event”类是否是个好主意,该类有一个订阅方法,该方法接受一个“EventHandler 接口”和一个 throw 方法。

这样我就不会因为单独的事件处理它们而将无数订阅者列表弄乱我的父类。

我能看到的唯一问题是 throw 命令的参数,因为不同的事件会有不同的参数。

我想出的解决方案是让 throw 方法接受一个对象数组,或者创建一个像 IEventArguemnts 这样的接口,它可以传递给 throw 命令并由订阅事件的代码处理,这似乎对我来说更有意义。

如果有任何改进建议,我将不胜感激。或任何改进。

【问题讨论】:

    标签: java events


    【解决方案1】:

    Java 有事件,也有对事件的 API 支持。查看java.util 包。你会看到java.util.EventListenerjava.util.EventObject 和其他一些。还有用于维护订阅者等的支持类。例如,AWT 和 Swing API 是基于事件的。

    通常addXxxListener(XxxListener l) 方法(即订阅方法)会在触发事件的类上运行,而不是在事件类本身上。事件就是消息,它是从发布者到订阅者所触发的内容。

    【讨论】:

    • 对,如果你使用它,你就不需要 Observer。这也是我的建议。
    • 我创建一个单独的事件类背后的逻辑是维护订阅者和通知他们的逻辑可以延迟到事件类。我会看看你提到的课程,看看他们是否能做我需要他们做的事情。
    • 看看 java.beans.PropertyChangeEvent、java.beans.PropertyChangeSupport 和 java.beans.PropertyChangeListener。如果一切都在一个 JVM 中,它们可能就是您所需要的。
    • 如果您将订阅者放入事件中,那么您最终会将订阅者列表传递给侦听器。一般来说,他们不使用那个。那里也可能存在安全问题。类比:如果您是邮购零售商,您在哪里维护您的邮寄名单?通常不在目录中...
    • ...举一个安全问题的例子,假设“成人内衣”供应商通过将其包含在产品目录中来管理其邮件列表。无论如何,安全问题不是关键问题。它将关注点分开。事件代表消息,而不是注册。
    【解决方案2】:

    为什么不直接使用 JavaBeans 事件模型?如果所有对象都在同一个 JVM 中运行,那就可以了。

    Peter Coad 对改进 Java Observer 模型有一些想法。也许你会发现这些很有帮助。

    【讨论】:

      猜你喜欢
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      • 2015-05-09
      • 1970-01-01
      相关资源
      最近更新 更多