我正在构建一个 Java 网络库和一个使用它的应用程序。该库包括:
- 一个 PacketSocket 接口(interface),它具有发送和接收字节数据包的方法。
- 它的两种实现方式,一种通过 TCP,一种通过 UDP。
- 一个 ObjectConnection 类,它构建在 PacketSocket 之上并处理对象到字节数据包的序列化。
应用程序在 UDPPacketSocket 之上使用 RequestConnection。 UDPPacketSocket 实现的独特之处在于它支持指定每个数据包是否应保证交付。我希望能够从应用程序内部使用,但无法通过 ObjectConnection 和 PacketSocket 接口(interface)。
我当然可以向这些接口(interface)中的适用方法添加一个 boolean 型保证参数,但最终(当有更多的 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
}
}
}
您如何看待这样的方法?
最佳答案
我认为这是一个丑陋的 hack,但有时它是唯一的选择,尤其是当您通过多层代码“传递”一个值并且您无法轻易修改该代码时。
如果可以的话,我会避免它。如果可能的话,更好的选择是拥有以下内容
myObjCon.sendGuaranteed(...);
关于java - "Passing arguments"通过 ThreadLocal 好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5701889/