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

MHa*_*ris 31 java

正在和一位同事聊聊Javas图书馆的设计.我提到我总是觉得很有趣的是AWT/Swing类调用它实际上在UI小部件上提供了一个Observable接口实际上被称为"监听器".

因此,他指出,与JDK 1.0一直存在的java.util.Observerjava.util.Observable之间存在名称冲突.我以前从未听说过他们.

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

Pét*_*rök 22

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

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

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

  • @Péter Török:您只能将实现 *Observer* 接口的对象附加到 *Observable*,这是完全正常的。我希望通过将它们包装在类型安全的接口中,您不会考虑使用泛型,因为由于类型擦除,它不适用于观察者/可观察者(好吧,它有效,但仅适用于非常简单的情况,其中基本Observable 也可以工作)。但是,当然,使用 COWAL 从头开始​​实施非常容易,因此使用这些旧的 1.0 残余物没有多大意义。 (2认同)
  • @WizardOfOdds:对可观察者/观察者使用泛型是观察者通常必须有权访问可观察者,并在此上下文中将其转换为相关类型。由于 JDK 的模式实现不提供泛型,因此很容易引发 ClassCast 问题。 (2认同)

Chr*_*ett 14

Observer并且Observable仍然在许多Eclipse向导代码中用于检测输入框中的内容何时发生更改,因此可以更新向导本身.我不得不使用其中的一些东西,根据自己的需要改变它.. :)