使一个不变的对象Cloneable是一个坏主意。 This is why String不可克隆。不可变的BigIntegerBigDecimal也不是Cloneable

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

这样做的原因是什么?

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

最佳答案

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

  • 很难使用界面(您必须将结果回退)
  • 语义不整洁(是深克隆还是浅克隆?)
  • 很难自定义

  • 所有这些使该界面不受欢迎。

    所以答案是:没有人想要

    编辑

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

    关于java - 是什么阻止了将Cloneable变成诸如StringBuilder之类的可变对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54019445/

    10-09 01:27