9

从这篇关于克隆与复制构造函数的 Artima 文章

Object 的 clone 方法非常棘手。它基于现场副本,并且是“语言外的”。它创建一个对象而不调用构造函数。不能保证它保留了构造函数建立的不变量。多年来,无论在 Sun 内部还是外部,都出现了很多错误,这是因为如果您只是在链上反复调用 super.clone 直到您克隆了一个对象,您就会得到该对象的浅表副本。

Joshua Bloch所说的外语是什么意思?

4

3 回答 3

9

他的意思是“Java 范围之外”。

特别是在 Java 中,创建新对象的“正确”方法是使用该对象的构造函数。许多类编写者在他们的构造函数中依赖这个假设和代码逻辑——比如输入验证或你想在构造时保证的任何其他东西——这就是他所说的“构造函数建立的不变量”。但是克隆绕过了这个基本约束,并在不调用构造函数的情况下创建了一个内存副本——因此它是“额外的语言”。

从技术上讲,序列化也是如此。

于 2013-03-08T17:10:42.280 回答
0

可能是因为它没有在 Java 中实现,但它在 Object 类中有一个本机。

于 2013-03-08T17:10:54.193 回答
0

语言外的对象创建机制(除了调用或链接构造函数之外的意思)是:

  1. 克隆
  2. 序列化
  3. 反射
  4. 字节码生成
于 2017-06-22T18:36:50.010 回答