1

Java ネットワーク ライブラリとそれを利用するアプリケーションの両方を構築しています。ライブラリは次のもので構成されています。

  • バイトのパケットを送受信するためのメソッドを持つインターフェース PacketSocket。
  • それの 2 つの実装、1 つは TCP 経由、もう 1 つは 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 に対して「保証されている」)。get()プロパティのオブジェクト メソッドを使用するか (たとえば、 の代わりにgetProperty())、または直接の Map インスタンスを使用することで、文字列の解析を回避できることに注意してください。その場合、値は真のオブジェクト (ブール値など) になる可能性があります。

于 2011-04-18T11:11:56.900 に答える