将不可变对象Cloneable
是一个坏主意。这就是String
不可克隆的原因。不可变的BigInteger
和BigDecimal
也不是Cloneable
。
但是可变的 StringBuilder 和 StringBuffer 无法克隆!
这个决定背后的原因是什么?
是的,我可以使用"复制构造函数"new StringBuilder(CharSequence seq)
但是提供复制构造函数并禁止克隆的设计原则/推理是什么?
因为Cloneable
从一开始就是错误的。
- 它有难以使用的界面(你必须投射结果)
- 不干净的语义(是深度克隆还是浅克隆?
- 很难定制
所有这些都使这个界面不受欢迎。
所以答案是:没有人想要它。
编辑
如果你想知道为什么在StringBuilder
中实现Cloneable
是个坏主意:Cloneable
有浅拷贝语义,这使得难以维护不变性(这是可变对象的浅拷贝的通用问题)。例如,toString
中有优化,如果我们克隆它,这些优化将被破坏。