2010-03-04 59 views
28

正在与一位同事聊天有关Java库的设计。我提到我总是觉得有趣的是,AWT/Swing类实际上提供了UI UI上的Observable接口,实际上被称为“侦听器”。java.util.Observable是否在任何地方使用?

因此,他指出,将会有一个与java.util.Observerjava.util.Observable之间的名称冲突,这些冲突自JDK 1.0以来一直存在。我以前从来没有听说过他们。

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

+0

你可以考虑这里报告它:http://stackoverflow.com/questions/1697215/what-is-你最喜欢的java-api-annoyance – ewernli 2010-03-04 16:07:16

+0

谢谢,但它并不那么令人讨厌。只是有点难过。 – MHarris 2010-03-05 11:48:10

+1

我发现它们在1996年有用,在JavaBeans和AWT 2.0支持更改监听语言的更普遍功能之前。把它们想象成你今天在整个JDK中看到的所有事件监听器接口的原型。它们只是具有历史意义。 – 2014-06-03 22:24:09

回答

12

ObserverObservable仍然用于很多Eclipse向导代码,用于检测输入框中的东西何时发生更改,因此向导本身可以更新。我不得不使用一些这些东西,改变它为我们自己的需要.. :)

18

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

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

这是由于在时间压力下进行的次优设计选择(其他包括Java 1.0 Collection API和java.util.Date)而在Java 1.0中存在缺陷的一件事,但由于公共API的性质,可以永远不会被删除(只有弃用)。

+1

@PéterTörök:您只能将实现* Observer *接口的对象附加到* Observable *上,这是非常正常的。我希望通过将它们包装在一个类型安全的接口中,您不会考虑使用泛型,因为它由于类型擦除而不适用于观察者/可观察对象(很好,它可以工作,但仅适用于简单的情况,可观察的作品也是)。但是,如果使用COWAL从头开始实现这一点非常容易,那么使用这些旧的1.0版本就没什么意义了。 – SyntaxT3rr0r 2010-03-04 17:04:00

+0

@WizardOfOdds我知道这一点。我编辑了代码,希望现在更清楚。 – 2010-03-04 17:28:27

+1

@WizardOfOdds:对于observable/observer使用泛型是观察者通常必须有权访问observable,并在此上下文中转换为其相关类型。由于JDK的模式实现不提供泛型,因此容易引发ClassCast问题。 – 2010-03-04 19:29:14

相关问题