我对Java中的对象引用有疑问。它总是通过引用将其对象发送到函数,这意味着如果您在发送的函数中修改了它们,它们将以修改后的形式返回。
解决此问题的方法是在发送之前复制对象。但是,我必须在对象类中创建一个复制函数吗?还是有其他选择?谢谢。
我对Java中的对象引用有疑问。它总是通过引用将其对象发送到函数,这意味着如果您在发送的函数中修改了它们,它们将以修改后的形式返回。
解决此问题的方法是在发送之前复制对象。但是,我必须在对象类中创建一个复制函数吗?还是有其他选择?谢谢。
public class MyObject {
//members
public MyObject(MyObject objectToCopy) {
this.member = objectToCopy.member;
//...
}
}
public void DoWork(MyObject object) {
MyObject copy = new MyObject(object);
//do stuff
}
Java始终是按值传递。你所描述的是将对象引用按值传递。
这里有一个关键区别。你不是传递对象引用,因此引用链接在你给参数分配新实例时就被断开了。只要引用值保持不变,在修改传入对象的内容后,当你返回到调用者时,修改都会持久化。另一个关键区别是引用值可以为null
……但null
并不是一个对象——那么你如何引用不存在的对象呢?
如果你想创建一个新对象,你需要复制现有对象。这个复制应该在方法内完成,以确保操作是一致的。
对于简单对象(类层次浅的对象,就像下面的例子),通常可以使用基本的复制构造函数:
class Album {
private String title;
private String artist;
public Album(Album copy) {
this.title = copy.title;
this.artist = copy.artist;
}
}
public void copyAlbum(Album album) {
album = new Album(album); // Clone the album passed in
}
对于更复杂的对象图,您可能想要使用诸如Orika或Dozer等库来精确创建对象的深层副本。 这个问题提供了一些有用的Java对象复制建议。
你需要为每个对象自己创建一个复制构造函数。原因很简单:如果A引用B并且你想要复制A,你会复制对B的引用还是整个被引用的B对象?这个问题必须针对每种情况单独回答,因此没有通用解决方案。
确实,您发送的是对象,并且对所引用的对象进行更改。在Java中没有简单的“本地”方法来复制对象,但是您可以使用Dozer等框架来复制对象: