我正在阅读Hiberante中所谓的UserType
,它声明了deepCopy(Object)
方法。作者建议我们对immutable
类使用以下实现:
因为
MonetaryAmount
是一个不可变类,所以是deepCopy()方法 返回它的论点。
为什么呢?我认为deepCopy实现如下:
public Object deepCopy(Object value) throws HibernateException {
return value;
}
实际上是浅 -copy。我错过了什么?
答案 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的任何内容都不会改变。
如果你有一个不可变对象,就没有必要对它进行深度复制,因为你可以在任何地方使用同一个对象 - 它不能被修改(因此是不可变的),所以这是非常安全的 - 而且速度很快。