2010-03-04 36 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

相關問題