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

Cod*_*ete 3 java stringbuilder clone stringbuffer cloneable

制作一个不可变对象是个坏主意Cloneable.这就是为什么 String不能克隆.不可变BigInteger并且BigDecimal没有 Cloneable.

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

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

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

tal*_*lex 9

因为Cloneable从一开始就是错误.

  • 它很难使用界面(你必须重新投射结果)
  • 不洁的语义(它会是深层克隆还是浅层克隆?)
  • 很难定制

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

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

编辑

如果你想知道为什么它会实现馊主意CloneableStringBuilder:Cloneable有浅拷贝语义,这使得难以维持不变(这是通用的问题与可变对象的浅拷贝).例如,toString在我们克隆它的情况下会有一些优化被破坏.