是什么阻止使 Cloneable 成为像 StringBuilder 这样的可变对象?

What prevents from making Cloneable a mutable object like StringBuilder?

创建一个不可变 对象Cloneable 是个坏主意。 This is why String 不可克隆。不可变 BigIntegerBigDecimal 不是 Cloneable.

但是可变的StringBuilder和StringBuffer不能克隆!

该决定背后的原因是什么?

是的,我可以使用 "copy constructor" new StringBuilder(CharSequence seq) 但是 提供复制构造函数并禁止克隆 的设计是什么 principle/reasoning?

因为Cloneable一开始就错了

  • 它有难以使用的接口(你必须将结果返回)
  • 语义不洁(是深克隆还是浅克隆?)
  • 很难定制

所有这些都让这个界面不受欢迎。

所以答案是:没人要

编辑

如果你想知道为什么在 StringBuilder 中实现 Cloneable 是个坏主意:Cloneable 具有浅拷贝语义,这使得不变量难以维护(这是可变对象浅拷贝的一般问题)。例如,toString 中有优化,如果我们克隆它,它将被破坏。