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



不可变对象Cloneable是一个坏主意。这就是String不可克隆的原因。不可变的BigIntegerBigDecimal也不是Cloneable

但是可变的 StringBuilder 和 StringBuffer 无法克隆!

这个决定背后的原因是什么?

是的,我可以使用"复制构造函数"new StringBuilder(CharSequence seq)但是提供复制构造函数并禁止克隆的设计原则/推理是什么

因为Cloneable从一开始就是错误的。

  • 它有难以使用的界面(你必须投射结果)
  • 不干净的语义(是深度克隆还是浅克隆?
  • 很难定制

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

所以答案是:没有人想要它

编辑

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

最新更新