是什么使Cloneable成为StringBuilder之类的可变对象呢?

时间:2019-01-03 09:27:17

标签: java clone stringbuilder stringbuffer cloneable

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

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

这种选择背后的原因是什么?

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

1 个答案:

答案 0 :(得分:9)

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

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

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

所以答案是:没人想要

编辑

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