制作不可变对象Cloneable
是一个坏主意。 This is why String
是不可克隆的。不变的BigInteger
和BigDecimal
也是不是 Cloneable
。
但是可变的 StringBuilder和StringBuffer无法克隆!
这种选择背后的原因是什么?
是的,我可以使用“复制构造函数” new StringBuilder(CharSequence seq)
,但是提供复制构造函数并禁止克隆的设计原理/理由是什么?
答案 0 :(得分:9)
因为Cloneable
从一开始就是错误。
所有这些使该界面不受欢迎。
所以答案是:没人想要。
编辑
如果您想知道为什么在Cloneable
中实现StringBuilder
会是个坏主意:Cloneable
具有浅拷贝语义,这使得难以维护不变式(这是通用问题与可变对象的浅表副本)。例如,toString
中有一些优化,如果我们将其克隆,这些优化将被破坏。