DDに関するウィキペディアの記事を読んでいて、最後にある「Java でのダブル ディスパッチと例」リンクにジャンプしました。次の Serializable の例の説明は、私にとってかなり混乱しているようです。
A a = new A();
ObjectOutputStream oos = new ObjectOutputStream();
oos.writeObject( a);
説明は次のとおりです。
A をシリアル化するために、
ObjectOutputStreamまずメソッドwriteObject( ObjectOutputStream oos)が存在するかどうかを確認します。存在する場合は、それ自体を引数としてそのメソッドを呼び出します。次に、writeObjectメソッドは呼び出しを にディスパッチしますObjectOutputStream(したがって、これは二重ディスパッチになります)。この非常に単純なコールバックを行う際に、ObjectOutputStreamは次のように述べています。「このストリームに状態を書き込む責任をあなたに委任します」その単純な選択を行うことで、ObjectOutputStreamはオブジェクトから切り離されましAた。オブジェクトAは、OK を返します。ここに、ストリームに書き込みたい状態があります。値がプリミティブの場合、write メソッドのオーバーロードによって処理できます。そうでない場合は、すべての有用な状態がストリームに配置されるまで、オブジェクト グラフの次のレベルで前後に続行できます。
説明されているのは舞台裏で起こっていることであり、提示されたコードではないため、説明が混乱している可能性があると思います。ここに私を混乱させる部分があります:
- 「
ObjectOutputStreamまず、メソッドwriteObject( ObjectOutputStream oos)が存在するかどうかを確認します」。ObjectOutputStreamこのメソッドは独自のメソッドであるため、このメソッドの存在を確認する必要があるのはなぜですか? - 「そうであれば、それ自体を引数としてそのメソッドを呼び出します」。
writeObjectのインスタンスをA引数として呼び出しているように見えます。前の項目に戻ると、 のインスタンスで呼び出されているのに、なぜ argでwriteObject署名を探すのでしょうか?ObjectOutputStreamA - 「
writeObjectその後、メソッドは呼び出しをにディスパッチしますObjectOutputStream(したがって、これを二重ディスパッチにします)」。繰り返しますが、writeObjectメソッドはクラスに属しているため、元の宛先のように見えるためObjectOutputStream、これがどのように「にディスパッチされているか」を確認できません。ObjectOutputStream
ここで基本的な何かが欠けているだけですか、それともこれは不十分に書かれた/説明された例ですか? それが悪い例である場合は、ウィキペディアの記事をより良い例に変更したいので、お気軽に提案をお寄せください.
ありがとう。