java.util.Observable 是不是在任何地方使用?

Posted

技术标签:

【中文标题】java.util.Observable 是不是在任何地方使用?【英文标题】:Is java.util.Observable used anywhere?java.util.Observable 是否在任何地方使用? 【发布时间】:2011-01-23 18:04:15 【问题描述】:

正在与一位同事谈论 Java 库的设计。我提到我一直觉得很有趣的是,在 UI 小部件上本质上提供 Observable 接口的 AWT/Swing 类实际上被称为“侦听器”。

于是他让我大吃一惊,指出自 JDK 1.0 以来就存在与 java.util.Observer 和 java.util.Observable 的名称冲突。我以前从未听说过它们。

JavaDocs 中没有列出任何用法,而 google/googlecode 并没有提供太多,所以有人知道它们是否在 JDK 中的某个地方使用过吗?他们似乎没有收到任何普通的爱,所以大概他们并不“受欢迎”。有人发现它们有用吗?

【问题讨论】:

你也可以考虑在这里举报:***.com/questions/1697215/… 谢谢,但这并不令人讨厌。有点难过。 我在 1996 年发现它们很有用,那时 JavaBeans 和 AWT 2.0 支持更改监听成为该语言更普遍的特性。将它们视为您今天在整个 JDK 中看到的所有事件侦听器接口的原型。它们仅具有历史意义。 【参考方案1】:

它们没有被使用,因为它们的设计有缺陷:它们不是type safe。您可以将任何实现 Observer 的对象附加到任何 Observable,这可能会导致细微的错误。

将它们包装在类型安全的接口中与从头实现模式的工作量大致相同,所以我猜在大多数情况下,后者是首选。

这是 Java 1.0 中的缺陷之一,原因是在时间压力下做出的次优设计选择(其他包括 Java 1.0 Collection API 和 java.util.Date),但由于公共 API 的性质,永远不可能不再被删除(仅弃用)。

【讨论】:

@Péter Török:您只能将实现 Observer 接口的对象附加到 Observable,这很正常。我希望通过将它们包装在类型安全的接口中,您不会考虑使用泛型,因为由于类型擦除,它不适用于观察者/可观察者(嗯,它有效,但仅适用于非常简单的情况,其中基本也可观察到的作品)。但是,当然,使用 COWAL 从头开始​​实施非常容易,因此使用这些旧的 1.0 残余没有多大意义。 @WizardOfOdds 我知道这一点。我编辑了代码,希望现在更清楚了。 @WizardOfOdds:对可观察对象/观察者使用泛型是观察者通常必须有权访问可观察对象,并在此上下文中将其转换为相关类型。由于 JDK 的模式实现不提供泛型,因此很容易引发 ClassCast 问题。 他们能够将泛型类型安全添加到其他现有类; Observer/Observable 有什么不同? @bacar,我只能猜测:要么是因为它被认为不够重要,要么是因为 - 不像例如集合类 - 这会改变它的语义。【参考方案2】:

ObserverObservable 仍然在很多 Eclipse 向导代码中用于检测输入框中的内容何时发生变化,因此可以更新向导本身。我不得不处理其中的一些东西,根据我们自己的需要进行更改.. :)

【讨论】:

以上是关于java.util.Observable 是不是在任何地方使用?的主要内容,如果未能解决你的问题,请参考以下文章

Java中使用Observer接口和Observable类实践Observer观察者模式

专业吸猫20年!一对一直播源码,Java观察者模式案例简析

C++11:参照Java Observable实现观察者模式

观察者设计模式

java自带的观察者模式

自定义观察者设计模式