3

私はRAW ソケットに関して肯定応答と再送信トランスポート プロトコルを実装しています。そのような場合、 のサブクラスが必要です。メソッドを実装するときは、次のようなものが必要です。SocketImplaccept

protected void accept(SocketImpl s) {
    ...
    s.copy(socket);
}

whereは、すでに初期化されているオブジェクトにコピーする必要がsocketある、既に計算されたオブジェクトです。つまり、 sourceを targetにコピーする変更可能な copy メソッドが必要です。存在することは知っていますが、新しいオブジェクトを返し、必要なのは mutateです。SocketImpl SocketImpls s.copy(socket)socketsObject clone()s

ところで、この場合のパラメーターの変更は壊れた設計だと考える人もいます。Java 標準ライブラリの例はこれだけではありません。of class は別の例です。しかし、これが Sun/Oracle のエンジニアが設計した方法です。なぜこれが悪いデザインなのか知りたいsimplAccept(Socket s)ServerSocket

一見すると、 ;と同等の一般的な浅いtarget.copy(source)場所を提供することには意味があるように思えます。しかし、それは存在しないため (おそらく正当な理由で説明してください)、唯一の方法はカスタムのフィールドごとのコピー メソッドをプログラムすることです。target = souce.clone()target = new TheClass(); target.copy(source)

私は正しいですか?ありがとう。

4

2 に答える 2

1

このメソッドの目的と仕組みを誤解しています。私はこれを何度もやった。にSocketImpl提供されたimplAccept()は、 ではなく、新しく受け入れられたソケット用ServerSocketです。したがって、2 番目のコピーは必要ありません。SocketImplこれをSocket、または独自の派生クラス にラップするだけですSocketSocket不思議なことに、この目的のために提供されているコンストラクタさえあります。

于 2012-10-25T22:48:29.137 に答える
0

クローン作成よりもめったに必要とされないため、標準(つまり、変更可能なコピー方法)はないtarget.copy(source)と思います。

  • (状況とすべてのフィールドに対して)個別に、それらをコピーするか同一にするかを決定する必要があります(クローンとディープクローンのように)。
  • 通常、外部で保持している参照を切り替えるだけの設計を作成できるため、この場合、s現在のオブジェクトの代わりに参照を使用するように切り替えることができます。これは、よりシンプルではるかに効率的です。コピーされた値が必要な場合、これはクローン作成 (またはコピー コンストラクターの使用) に対応します。
  • パラメータ(あなたの場合はオブジェクト)をラップすることで簡単に実装できますs

最後のポイントは、2 番目の質問にも答えます。フィールドごとのコピーの代わりに、SocketImpl のすべてのエクスポートされたメソッドをラップされたコア SocketImpl に転送する転送クラスを実装できます。

  • 例外をスローするだけで、現在の実装クラスCをプライベート実装として使用します。protected void accept(SocketImpl s)
  • D転送クラスを 書く
    • Cプライベート フィールドに保持されている SocketImpl (例: のオブジェクト) をラップします。wrapped
    • SocketImpl を拡張し、そのすべてのメソッドを転送しますがacceptwrapped
    • protected void accept(SocketImpl s)で簡単に実装{ s.wrapped = this; }
  • 特定の状況ですべてのフィールドをコピーしたい場合は、コピーacceptされたパラメーターを指定します。accept(s.clone())accept
  • Dの例外Cがスローされないように、 type のオブジェクトのみを提供します。

¹ のこの実装はaccept、タイプのパラメーターに対してのみ機能しますD。それ以外の場合、この恐ろしい設計 (パラメーターとして指定された SocketImpl を変更する必要がある) ではaccept、リフレクションなどの醜い手法を使用する必要があります (たとえば、http://www.docjar.com/の org.apache.harmony.luni.net.PlainSocketImpl を参照)。 html/api/org/apache/harmony/luni/net/PlainSocketImpl.java.html )。

于 2012-10-25T22:13:31.030 に答える