【问题标题】:Copying listeners/observers in a copy constructor在复制构造函数中复制侦听器/观察器
【发布时间】:2010-09-23 07:20:15
【问题描述】:

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

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

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

有什么想法吗?有什么最佳做法吗?

【问题讨论】:

    标签: java


    【解决方案1】:

    答案是这取决于你想要发生什么

    从技术上讲,您可以做三件事:

    1. 什么都不复制。任何观察者都不会对新对象一无所知。
    2. 让新对象将自己添加到旧观察者正在观察的事物列表中。现有的观察者将像对旧对象一样响应新对象。
    3. 创建新的观察者来观察新对象,就像旧的观察者观察旧对象一样。新的观察者将对新对象的变化做出响应,就像旧的观察者对旧对象所做的那样。

    其他发帖者肯定是正确的,1) 可能是首选选项,只是因为在复制构造函数中执行 2 或 3 意味着观察者总是被创建/复制。什么都不做允许稍后在必要时添加观察者。

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

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

    【讨论】:

      【解决方案2】:

      我的偏好是不要复制听众

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

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

      【讨论】:

        【解决方案3】:

        不要抄袭。侦听器不知道新对象,也不希望收到与其相关的消息。

        【讨论】:

          【解决方案4】:

          不要抄袭。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-03-06
            • 1970-01-01
            • 2013-10-13
            • 1970-01-01
            • 2012-02-04
            相关资源
            最近更新 更多