了解deepCopy概念

时间:2015-07-23 07:53:16

标签: java copy

我正在阅读Hiberante中所谓的UserType,它声明了deepCopy(Object)方法。作者建议我们对immutable类使用以下实现:

  

因为MonetaryAmount是一个不可变类,所以是deepCopy()方法   返回它的论点。

为什么呢?我认为deepCopy实现如下:

public Object deepCopy(Object value) throws HibernateException {
    return value;
}

实际上是 -copy。我错过了什么?

2 个答案:

答案 0 :(得分:1)

不可变对象无法改变它的状态。因此,如果您返回相同的对象并不重要。因为无论如何都不能对它进行修改。因此,当无副本时,它实际上就像deepCopy一样。

我们举一个String的例子。

String s1 = "hello";
String s2 = new String(s1);
String s3 = s1;

对任何变量执行的操作并不重要,它不会影响其他变量。

答案 1 :(得分:1)

如果你将同一个对象放回方法中,那么根本不是任何副本,既不是吞下也不是深。如果将给定对象中的所有引用复制到新引用,则会出现浅拷贝。深层复制是指您取消引用所有内容并创建原始所有子对象等的副本。

示例:

MyObject具有对Calendar对象的引用。

浅拷贝到" MyCopy":

MyCopy(一个新对象,与MyObject不同(==))获得引用相同日历对象。

问题:如果我现在修改" MyCopy"的日历," MyObject"的日历也将改变,因为它是同一个。

深层复制:

MyCopy会获得日历,这是MyObject日历的完整(本身深层)副本

优点:如果我现在修改MyCopy的日历,那么MyObject的任何内容都不会改变。

如果你有一个不可变对象,就没有必要对它进行深度复制,因为你可以在任何地方使用同一个对象 - 它不能被修改(因此是不可变的),所以这是非常安全的 - 而且速度很快。

另见Wikipedia