是什么阻止使 Cloneable 成为像 StringBuilder 这样的可变对象?
What prevents from making Cloneable a mutable object like StringBuilder?
创建一个不可变 对象Cloneable
是个坏主意。 This is why String
不可克隆。不可变 BigInteger
和 BigDecimal
也 不是 Cloneable
.
但是可变的StringBuilder和StringBuffer不能克隆!
该决定背后的原因是什么?
是的,我可以使用 "copy constructor" new StringBuilder(CharSequence seq)
但是 提供复制构造函数并禁止克隆 的设计是什么 principle/reasoning?
因为Cloneable
一开始就错了
- 它有难以使用的接口(你必须将结果返回)
- 语义不洁(是深克隆还是浅克隆?)
- 很难定制
所有这些都让这个界面不受欢迎。
所以答案是:没人要。
编辑
如果你想知道为什么在 StringBuilder
中实现 Cloneable
是个坏主意:Cloneable
具有浅拷贝语义,这使得不变量难以维护(这是可变对象浅拷贝的一般问题)。例如,toString
中有优化,如果我们克隆它,它将被破坏。
创建一个不可变 对象Cloneable
是个坏主意。 This is why String
不可克隆。不可变 BigInteger
和 BigDecimal
也 不是 Cloneable
.
但是可变的StringBuilder和StringBuffer不能克隆!
该决定背后的原因是什么?
是的,我可以使用 "copy constructor" new StringBuilder(CharSequence seq)
但是 提供复制构造函数并禁止克隆 的设计是什么 principle/reasoning?
因为Cloneable
一开始就错了
- 它有难以使用的接口(你必须将结果返回)
- 语义不洁(是深克隆还是浅克隆?)
- 很难定制
所有这些都让这个界面不受欢迎。
所以答案是:没人要。
编辑
如果你想知道为什么在 StringBuilder
中实现 Cloneable
是个坏主意:Cloneable
具有浅拷贝语义,这使得不变量难以维护(这是可变对象浅拷贝的一般问题)。例如,toString
中有优化,如果我们克隆它,它将被破坏。