【问题标题】:Calling constructors while cloning克隆时调用构造函数
【发布时间】:2015-09-10 09:25:43
【问题描述】:

这是来自 Effective Java 的引述:

在这里,复制自 java.lang.Object 的规范 [JavaSE6]:

创建并返回此对象的副本。的确切含义 “复制”可能取决于对象的类别。总体意图是 即,对于任何对象 x,表达式

x.clone() != x 

将是真的,并且表达式

x.clone().getClass() == x.getClass() 

确实如此,但这些不是绝对要求。虽然通常情况下

x.clone().equals(x) 

会是真的,这不是一个绝对的要求。 复制一个对象通常需要创建一个新对象 其类的实例,但可能需要复制内部数据 结构也是如此。不调用任何构造函数。

现在让我们看看JavaSE6 javadocs

创建并返回此对象的副本。的确切含义 “复制”可能取决于对象的类别。总体意图是 即,对于任何对象 x,表达式:

x.clone() != x will be true,

那表达式:

x.clone().getClass() == x.getClass() 

将是 是的,但这些不是绝对要求。虽然它通常是 情况:

x.clone().equals(x) 

会是真的,这不是 绝对要求。

他在哪里找到强调的文字?有什么要求?

【问题讨论】:

    标签: java clone


    【解决方案1】:

    这是非常糟糕的措辞。 o != o.clone() 因为你有两个对象,它们存储在不同的内存位置。它们与对同一事物的两次引用不同。

    按照惯例,克隆只是一种方法,您希望一个对象和它的克隆具有相同的类,并且可能想要伤害编写没有实现该方法的方法的人,但克隆可能是对他们有意义的方法名称。

    .equals 也是一种方法。它是如何实施的?对此也有一些约定,开发人员可以选择实施您可能不同意的比较。

    没有任何要求,因此只是一个约定,而且绝对不总是遵循,无论是设计还是无能。

    我们在这里真正谈论的是平等与等价的延伸。

    【讨论】:

      【解决方案2】:

      克隆通常被视为深层副本。如果你只克隆“主对象”,它的成员对象就不会是深拷贝。因此,为了正确地进行克隆,您必须遍历整个对象层次结构并克隆所有可克隆的成员。

      使用clone() 通常是个坏主意,而且非常麻烦。相反,序列化和反序列化对象图更方便。在这种情况下也不会调用任何构造函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多