【问题标题】:"Passing arguments" via ThreadLocal ok?通过 ThreadLocal “传递参数”好吗?
【发布时间】: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


【解决方案1】:

因为我们知道它是一个 UDP,我们可以去抽象层并访问具体的东西

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

【讨论】:

  • 它应该是每个数据包的标志。
【解决方案2】:

我会推荐某种“性能特征”参数,可能类似于 Properties 实例。然后,每个 impl 可以使用自己的任意属性(例如,“保证”为您当前的 impl)。请注意,您可以通过使用 Properties 上的对象方法(例如 get() 而不是 getProperty())或使用直接 Map 实例来避免字符串解析。那么你的值可能是真正的对象(例如布尔值)。

【讨论】:

    【解决方案3】:

    我同意这是一个丑陋的 hack。它会起作用,但你最终可能会后悔。

    我会通过使用Properties 对象来传递各种PacketSocket 实现参数来处理这个问题。如果这令人不快,请定义一个 PacketSocketParameters 接口,并为不同类型的 PacketSocket 定义一个实现类的层次结构。

    【讨论】:

      【解决方案4】:

      我认为这是一个丑陋的 hack,但有时它是唯一的选择,尤其是当您通过多层代码“传递”一个值并且您无法轻松修改该代码时。

      如果可以的话,我会避免它。如果可能的话,更好的选择是拥有以下内容

       myObjCon.sendGuaranteed(...);
      

      【讨论】:

      • 你可以引入一个接口Packet,它表示发送的数据包,方法是setGuaranteed(boolean b)。您发送的所有对象都可能实现该接口。
      • @weekens:问题是我将一个对象输入ObjectConnection,但UDPPacketSocket 得到一个字节数组。或者更一般地说,实现该接口的对象在到达UDPPacketSocket 之前就被销毁了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 2021-08-21
      • 2020-05-14
      • 2022-01-25
      • 2014-05-22
      相关资源
      最近更新 更多