使一个不变的对象Cloneable
是一个坏主意。 This is why String
不可克隆。不可变的BigInteger
和BigDecimal
也不是Cloneable
。
但是无法克隆可变的 StringBuilder和StringBuffer!
这样做的原因是什么?
是的,我可以使用“复制构造函数” new StringBuilder(CharSequence seq)
,但是提供复制构造函数并禁止克隆的设计原则/理由是什么?
最佳答案
因为Cloneable
从一开始就是错误的。
所有这些使该界面不受欢迎。
所以答案是:没有人想要。
编辑
如果您想知道为什么在
Cloneable
中实现StringBuilder
会是个坏主意:Cloneable
具有浅表复制语义,这使得难以维护不变式(这是可变对象浅表复制的通用问题)。例如,toString
中有一些优化,如果我们将其克隆,这些优化将被破坏。关于java - 是什么阻止了将Cloneable变成诸如StringBuilder之类的可变对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54019445/