java - "Passing arguments"通过 ThreadLocal 好吗?

标签 java oop interface static thread-local

我正在构建一个 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/

相关文章:

Java 显示无效字符?

java - 从某个类的集合中获取所有变量的最佳方法

java - 如何获取成员变量的注释?

java - 将方法与返回的 jcomponents 和泛型一起使用

ruby - 如何在 ruby​​ 中使基类方法不可重写?

c++ - 如果我不应该使用 unsigned,我该如何在类型级别指定一个非负数?

java - 在Runtime.execute()中输入参数并通过java swing应用程序继续执行cmd命令

oop - 面向对象编程中的外观

c++ - 用C++类实现数组属性

Java - 两个具有相同方法的接口(interface),一个只是通用的