为什么人们说我们不需要复制不可变类?

3

不可变类是指其实例不能被修改的类。不可变类适用于缓存目的,且线程安全。不可变对象是指一旦初始化,其状态就不会改变的实例。

而对象克隆是指创建一个对象的精确副本。它创建当前对象类的新实例,并使用与该对象相应字段的内容完全相同的内容初始化其所有字段。

现在,问题是为什么说我们不需要克隆不可变类?

这是因为创建已用于缓存目的的数据的精确副本将增加系统中产生的垃圾,并潜在地减慢应用程序的运行速度。或者还有其他相关答案。


由于您可以确保不可变性,因此始终可以为您的目的使用相同的对象,从而避免任何副作用。 - Ishan Arora
2个回答

8

如果要在不改变原对象状态的情况下更改其副本的状态,则需要创建对象的副本(克隆)。

由于不可变类的对象状态无法更改,因此可以放心使用原始对象而不会产生任何风险。


4
如果您已经有一个不可变类的对象,那么拥有第二个功能相同的对象就没有意义了,您可以在任何地方都使用同一实例。此外,如果您将其克隆,则会增加两倍的内存使用量而没有额外的收益。

正是我的观点,相同的对象不会起到任何作用,只会导致大量的垃圾回收。 - dgupta3091
1
这不是挑剔,而是强调一个关键的区别:对象 不是 “相同”的。它们(或者通常应该)相等。在Java中,这意味着基本上对于 Person p0 = new Person("Jon"); Person p1 = new Person("Jon"); 的比较 p0 == p1 将返回 false(因为对象并不相同),而 p0.equals(p1) 应该返回 true(假设有适当的 equals 实现)。 - Marco13
@Marco13 是的,没错,我表述有点不清楚。 - ruohola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接