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】:Observer
和 Observable
仍然在很多 Eclipse 向导代码中用于检测输入框中的内容何时发生变化,因此可以更新向导本身。我不得不处理其中的一些东西,根据我们自己的需要进行更改.. :)
【讨论】:
以上是关于java.util.Observable 是不是在任何地方使用?的主要内容,如果未能解决你的问题,请参考以下文章
Java中使用Observer接口和Observable类实践Observer观察者模式