Observer 接口方法中 update() 中第二个参数的意义是什么

What's the significance of the second arguement in update() in Observer interface method

在研究观察者模式的时候 Observer 接口有更新方法:

public void update(Observable obs, Object obj)

第一个参数是发出update()方法的观察者,但是第二个参数Object obj我看不懂。 Oracle 文档将其表述为:

arg - an argument passed to the notifyObservers method.

如果我尝试打印它,java 会抛出 NPE,如果它为空,它有什么用?

每个注册的侦听器都将收到通知并接收该对象。这就像 javascript onClick 的回调中的事件。如果您想从 update() 向侦听器提供一些信息,该对象将为您提供方法。

我将首先回答您的问题 - update 调用中的 Object 参数是您传递给 notifyObservers() 方法的对象。请注意 notifyObservers() 也有一个重载 notifyObservers(Object arg) 这个 arg 是作为第二个参数传递给 update 方法的内容。

示例参考this link。

在您的情况下,您必须调用 notifyObservers() 重载 - 它可能默认为传递给 update 方法的空对象。

也就是说 - Java 中的 Observable 模式是一个古老的脆弱概念,正如 JB Nizet 评论的那样。在备选方案方面,有一个 article 将使用 Spring 事件来实现观察者模式。

实现自己的也不难。看看这个 example

需要注意的重要一点是,双参数方法实际上表示传递给观察者的两种信息样式。 Observable 有两种通知方法 - notifyObservers()notifyObservers(Object args) - 在后一种方法中,参数是一个 任意 数据对象传递。因此,如果一个应用程序想要支持 pushing data,那么它将调用带参数的方法并传递数据。但是,如果这 传递的对象为 null 那么这意味着 Observer 必须从 Observable 对象本身 pull 有趣的数据(其更改引起通知)。

这个设计背后的整个想法是 Observable(主题)具有观察者感兴趣的状态。除了状态之外,它还有添加/删除/通知的方法。因此,应用程序(外部客户端)将有一个 Observable 引用,使用该引用它将调用适当的方法到 add/remove 特定 Observable 的 Observer 对象。使用这种设计,每个 Observable 都可以有一个单独的观察者列表。 Observable 对观察者的唯一了解是它有一个感兴趣的观察者列表。可以随时添加新的 Observer,也不需要修改 Observable 来添加新类型的 Observer 对象,只需要 class 来实现 Observer。