【发布时间】:2012-10-31 05:00:22
【问题描述】:
我正在阅读关于DD 的维基百科文章并跳转到最后给出的"Double dispatch in Java and an example" 链接。以下 Serializable 示例的描述对我来说似乎相当混乱:
A a = new A();
ObjectOutputStream oos = new ObjectOutputStream();
oos.writeObject( a);
这里是描述:
为了序列化A,
ObjectOutputStream首先查看方法writeObject( ObjectOutputStream oos)是否存在。如果是这样,那么它以自身作为参数调用该方法。然后writeObject方法将调用分派回ObjectOutputStream(从而使其成为双重分派)。在进行这个非常简单的回调时,ObjectOutputStream说:“我将把你的状态写入这个流的责任委托给你”。在做出这个简单的选择时,ObjectOutputStream已经与我们的对象A分离。对象A反过来说好的,这是我想写在流上的一些状态。如果该值是一个原始值,那么它可以通过 write 方法的重载来处理。如果没有,则可以在对象图中的下一层继续来回进行,直到所有有用的状态都放在流上。
我猜测描述可能会令人困惑,因为描述的是幕后发生的事情,而不是呈现的代码,否则它似乎没有多大意义。以下是让我感到困惑的部分:
- “
ObjectOutputStream首先查看方法writeObject( ObjectOutputStream oos)是否存在”。为什么ObjectOutputStream需要检查这个方法是否存在,因为它是它自己的方法? - “如果确实如此,那么它会以自身作为参数调用该方法”。在我看来,它使用
A的实例作为参数调用writeObject。回到上一项,如果使用A的实例调用它,为什么要查找带有ObjectOutputStreamarg 的writeObject签名? - “然后
writeObject方法将调用分派回ObjectOutputStream(因此使其成为双重分派)”。同样,writeObject方法属于ObjectOutputStream类,所以我看不到它是如何“派回ObjectOutputStream”的,因为那似乎是原始目的地。
我只是在这里遗漏了一些基本的东西,还是这是一个写得不好/描述不好的例子?如果这是一个不好的例子,我想将 Wikipedia 文章更改为指向更好的文章,因此请随时提供建议。
谢谢。
【问题讨论】:
-
感谢您的精彩回答。我仍然相信,如果对底层机制有一个简短的描述/解释,这篇文章会更好。
-
技术上准确,但措辞笨拙。你说得对,一两个例子会有所帮助。
标签: java double-dispatch