在复制构造函数中复制侦听器/观察器

时间:2008-11-20 18:08:31

标签: java

我正在编写一个实现可观察模式(而不是接口)的类,我正在考虑复制构造函数是否也应该复制监听器。

一方面,复制构造函数应该创建一个尽可能接近原始实例的实例,以便可以在显示上下文中交换它。

另一方面,这将假设听众可以应付这种事情。

有什么想法?有没有最好的做法?

4 个答案:

答案 0 :(得分:5)

不要复制。监听器不知道新对象,也不期望接收与之相关的消息。

答案 1 :(得分:3)

答案取决于您想要发生的事情

技术上你可以做三件事:

  1. 什么都不复制。任何观察者都不会对新物体一无所知。
  2. 让新对象将自己添加到旧观察者正在观察的事物列表中。现有的观察者将像旧的一样回应新的对象。
  3. 创建观察新对象的新观察者,就像旧对象一样。新观察者将对新对象的变化做出响应,就像旧对象对旧对象所做的那样。
  4. 其他海报肯定是正确的1)可能是首选选项,只是因为在复制构造函数中执行2或3意味着观察者始终创建/复制。什么都不做允许稍后在必要时添加观察者。

    然而,可以想象其他选项是正确的情况。如果您想要一个响应给定类的任何实例的观察者,无论如何创建,那么2)是正确的。如果您的观察者为该对象执行特定任务,并且不关心系统的其余部分,那么3)可能就是这样。

    通常最好考虑一下您的系统如何工作,而不仅仅是遵循规则。如果这不是您要修改的代码,请询问所有者。如果您根本不知道自己想要发生什么,请选择1)并稍后添加观察者。

答案 2 :(得分:1)

我的偏好是不要复制听众

侦听器是在原始对象上注册的,而不是副本 - 如果您决定使用复制构造函数作为原型模式的基础,那么您最终将使用相同的侦听器来侦听系统中的每个对象。

然而:与所有这些类型的问题一样,从最小开始(即不要复制),然后看看你是如何继续的。如果你发现自己在构造对象之后重复相同的代码,每次使用该构造函数(比如说超过3-4次),那么重新审视这个决定可能会很有成效。

答案 3 :(得分:0)

不要复制。