1

我正在构建一个 Java 网络库和一个使用它的应用程序。图书馆包括:

  • 一个接口 PacketSocket,它具有发送和接收字节数据包的方法。
  • 它有两种实现,一种通过 TCP,一种通过 UDP。
  • 建立在 PacketSocket 之上的 ObjectConnection 类,将对象序列化为字节数据包。

应用程序在 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
    }

  }
}

您如何看待这样的方法?

4

4 回答 4

3

我认为这是一个丑陋的黑客,但有时它是唯一的选择,特别是如果你通过多层代码“传递”一个值并且你不能轻易修改该代码。

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

 myObjCon.sendGuaranteed(...);
于 2011-04-18T11:05:19.363 回答
0

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

( (UDPSocket)connection.getSocket() ).setGuaranteed(true);
于 2011-04-18T16:24:38.057 回答
0

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

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

于 2011-04-18T11:11:20.867 回答
0

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

于 2011-04-18T11:11:56.900 回答