我正在構建一個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
}
}
}
你覺得這樣的做法有什麼看法?
嗯,當然感覺就像一個黑客,但我不明白爲什麼它會出問題。在代碼審查中,我會抱怨它。這有點令人困惑和不明顯。 – 2011-04-18 11:06:23
現在我想起來了,它就是Java2D用'setStroke'等做的,但更深入的。 – 2011-04-18 11:20:38