2011-04-18 118 views
1

我正在構建一個Java網絡庫和一個使用它的應用程序。該庫由以下部分組成:通過ThreadLocal的「傳遞參數」好嗎?

  • 接口PacketSocket,它具有發送和接收字節數據包的方法。
  • 它的兩個實現,一個通過TCP和一個通過UDP。
  • 一個ObjectConnection類,它構建在PacketSocket之上並處理對象到字節包的序列化。

應用程序在UDPPacketSocket之上使用RequestConnection。 UDPPacketSocket實現是獨一無二的,因爲它支持指定每個數據包是否應保證傳遞。我希望能夠從應用程序中使用,但無法通過ObjectConnection和PacketSocket接口。

我當然可以爲這些接口中的適用方法添加一個布爾型保證參數,但是我最終會(當有更多的PacketSocket實現時)必須添加許多特定於某些實現的參數並被別人忽視。

相反,我雖然我可以用UDPPacketSocket的靜態線程本地地產做,像這樣:

class Application { 

    public void sendStuff() { 

    // is stored in a ThreadLocal, so this code is still thread-safe 
    UDPPacketSocket.setGuaranteed(true); 

    try { 
     myObjCon.send(...); 
    } finally { 
     // ... restore old value of guaranteed 
    } 

    } 
} 

你覺得這樣的做法有什麼看法?

+0

嗯,當然感覺就像一個黑客,但我不明白爲什麼它會出問題。在代碼審查中,我會抱怨它。這有點令人困惑和不明顯。 – 2011-04-18 11:06:23

+0

現在我想起來了,它就是Java2D用'setStroke'等做的,但更深入的。 – 2011-04-18 11:20:38

回答

3

我認爲它是一個醜陋的黑客,但有時它只是選項,尤其是如果你通過許多層代碼「傳遞」一個值,並且你不能輕易修改該代碼。

如果可以的話,我會避免它。如果可能的話,更好的選擇是擁有以下內容:

myObjCon.sendGuaranteed(...); 
+0

您可以使用setGuaranteed(boolean b)方法引入一個接口Packet,它表示發送的數據包。您發送的所有對象都可以實現該接口。 – weekens 2011-04-18 11:09:41

+0

@weekens:問題在於我將對象提供給ObjectConnection,但UDPPacketSocket獲取一個字節數組。或者更一般地說,實現該接口的對象在到達UDPPacketSocket之前被銷燬。 – 2011-04-18 11:17:49

0

我同意這是一個醜陋的黑客。它會工作,但你可能會後悔做到這一點。

我想通過使用一個Properties對象來處理這個對象來傳遞各種PacketSocket實現參數。如果這樣做不好,請爲不同類型的PacketSocket定義一個PacketSocketParameters接口和一個實現類層次結構。

0

我會推薦某種「性能特徵」參數,也許像一個屬性實例。那麼每個impl都可以使用它們自己的任意屬性(例如,對於當前的impl「保證」)。請注意,您可以通過使用屬性上的對象方法(例如get()而不是getProperty())或使用直線Map實例來避免字符串解析。那麼你的值可能是真實的對象(例如布爾)。

0

,因爲我們知道這是一個UDP,我們可以去抽象層和訪問的具體的東西

((UDPSocket)connection.getSocket()).setGuaranteed(true); 
+0

它應該是一個每個數據包的標誌。 – jtahlborn 2011-04-18 16:33:24