2010-05-15 31 views
2

java.util.Collections目前提供用於創建各種集合接口​​包裝下面的實用方法:編寫同步線程安全的包裝器的NavigableMap

類似,它也有6個unmodifiedXXX重載。

這裏明顯的遺漏是NavigableMap<K,V>的實用方法。確實,extends SortedMapSortedSet extends SetSet extends CollectionCollections對於SortedSetSet都有專門的實用方法。據推測NavigableMap是一個有用的抽象,否則它不會在那裏,但它沒有實用的方法。

所以問題是:

  • 有爲什麼Collections沒有爲NavigableMap提供實用方法具體原因是什麼?
  • 你會如何編寫自己的​​包裝NavigableMap
    • source code for OpenJDK version of Collections.java掃視似乎表明,這僅僅是一個「機械」過程
      • 這是真的,一般你可以添加​​線程safetiness功能也是這樣嗎?
      • 如果是這樣的機械過程,它可以自動化嗎? (Eclipse插件等)
      • 此代碼重複是否必要,或者是否可以通過不同的OOP設計模式避免?

回答

4

這是一個疏忽。 The fix is in progress

喬什寫道:

「他們絕對屬於有他們的缺席是無意
我們要儘快把他們儘可能。」

我同意,即使我們沒有一位工程師正在期待 來編寫(和測試)所有那些令人頭腦麻木的轉發方法。 發佈日期:2006-08-21 00:50:41.0

雖然需要一段時間。

更新:以手動實現它,你可以考慮劫持java.util包,因爲你想延長其聲明的包私人static class SynchronizedSortedMap<K, V>。否則這將會是很多代碼複製粘貼。這裏有一個開球:

package java.util; 

import java.util.Collections.SynchronizedSortedMap; 

public class NewCollections { 

    public static <K, V> NavigableMap<K, V> synchronizedNavigableMap(NavigableMap<K, V> m) { 
     return new SynchronizedNavigableMap<K, V>(m); 
    } 

    static class SynchronizedNavigableMap<K, V> extends SynchronizedSortedMap<K, V> implements NavigableMap<K, V> { 
     private final NavigableMap<K, V> sm; 

     SynchronizedNavigableMap(NavigableMap<K, V> m) { 
      super(m); 
      sm = m; 
     } 

     SynchronizedNavigableMap(NavigableMap<K, V> m, Object mutex) { 
      super(m, mutex); 
      sm = m; 
     } 

    } 
} 

讓IDE自動生成的NavigableMap未實現的方法和代碼,他們以同樣的方式爲SynchronizedSortedMap一樣。這裏有一個例子:

 @Override 
     public K ceilingKey(K key) { 
      synchronized (mutex) { return sm.ceilingKey(key); } 
     } 

注意,返回例如Set的方法,你需要將其包裝在SynchronizedSet爲好。再次,請參閱SynchronizedMapSynchronizedSortedMap來源獲取洞察:)

我不認爲它是(可以是)機械過程,因爲它涉及很多因素。

+0

Woot!正如它爲「爲什麼?」所說的那樣具有權威性。不過,我現在無法接受這個答案,因爲它錯過了「如何?」。你願意對此發表評論嗎?這仍然是我的問題的重要組成部分。編寫和測試這些「令人頭腦麻木的轉發方法」有多困難?它可以不是半自動的嗎?等 – polygenelubricants 2010-05-16 05:08:26

+0

我只是從'Collections'源文件中複製'靜態類SynchronizedMap'和'靜態類SynchronizedSortedMap',添加你自己的'SynchronizedNavigableMap',它擴展了SynchronizedSortedMap''並且以與兩個複製類相同的方式裝飾缺少的方法確實。這將是很多的代碼,它已經晚了:) – BalusC 2010-05-16 05:14:11

+0

它是這樣一個機械和「頭腦麻木」的過程!人們會認爲它應該是可自動化的! – polygenelubricants 2010-05-16 05:46:59

1

有爲什麼收藏不適合的NavigableMap提供實用方法具體原因是什麼?

我想不出具體的原因。它要麼

  • 監督,
  • 的「幾乎沒有人會使用它」的情況下,或
  • 也許有,是不是很明顯一些技術難度。

但是在任何一種情況下,原因並不重要。該實用程序方法不存在,因此無論您是找到第三方庫還是自己實施它。

難道一般情況下,您可以添加像這樣的同步線程安全性功能嗎?

總體上沒有。您需要了解您正在綁定的類的語義,以確保線程安全,以確定包裝是否足夠。

如果是這樣的機械過程,它可以自動化嗎? (Eclipse插件等)

不...看上面。

這段代碼是否需要重複,或者它是否可以通過不同的OOP設計模式避免?

我不認爲這是可以避免的。這種事情通常需要對元編程的語言支持,或者對於編寫包裝類的具體情況。設計模式不適合你。

+0

只是爲了澄清我自己的理解,不過,這是裝飾圖案'Collections'確實有關於包裝類?例如'synchronizedSet'返回一個'Set',它可以「裝飾」另一個具有威脅安全特性的'Set',但是它本身不會自己做任何'Set'類的工作? – polygenelubricants 2010-05-15 15:02:07

+0

@polygenelubricants我會說這是對的。 – 2010-05-16 00:37:35

2

這是真的,一般你可以添加 同步線程safetiness功能 這樣嗎?

我相信這是真的。線程安全的定義是(IMO)

如果從多線程調用它時,如果沒有不正確的行爲(在單線程中使用時不會發生這種行爲)可以對其所有方法發生,則該類是線程安全的沒有任何外部同步。

現在,下面的代碼將確保「Something」永遠不會被多個線程調用,對吧?因此,我認爲不會因多線程調用而出現不良行爲;它從來沒有從多個線程調用!

這也可能是EJB背後的想法。無狀態EJB永遠不會被多個線程調用(由容器強制執行)。這就是爲什麼EJB規範可以說「你不必擔心線程安全性」。

public class MakeSomethingThreadSafe implements Something { 
    private final Object lock = new Object(); 
    private final Something subject; 

    public MakeSomethingThreadSafe(Something subject){ 
     this.subject = subject; 
    } 

    public void someMethod(){ 
     synchronized(lock){ 
      subject.someMethod(); 
     } 
    } 
} 

或者我錯過了什麼?

爲了使後完成:

有爲什麼 收藏不適合的NavigableMap提供實用 方法,具體原因是什麼?

我同意斯蒂芬。

你會如何編寫自己的 NavigableMap的同步包裝?

像我的示例代碼..

這是真的,一般你可以添加 同步線程safetiness功能 這樣嗎?如果是這樣的機械 過程,它可以自動化嗎? (Eclipse 插件等)

是的,我認爲它可以很容易地自動化。

  1. 實現接口
  2. 讓2場;一個用於互斥,一個用於主題。
  3. 創建一個構造函數來注入主題。
  4. 使每個方法同步並委託給主題。

這是代碼重複必要,或者 難道是避免由 不同的面向對象的設計模式?

喜歡SetMap等?對我來說,這聽起來不太可能以「正常」的方式解決。