【发布时间】:2011-08-07 19:07:22
【问题描述】:
我正在构建一个 Java 网络库和一个使用它的应用程序。该库包括:
- 一个接口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
}
}
}
您如何看待这样的方法?
【问题讨论】:
-
嗯,它确实感觉像一个黑客,但我不明白为什么它会出错。在代码审查中,我会抱怨它。这有点令人困惑且不明显。
-
现在我想起来了,这有点像 Java2D 对
setStroke等所做的事情,但更深入。
标签: java oop interface static thread-local