我对 Java 中的对象引用有疑问。它总是通过引用函数来发送它的对象,这意味着如果你在发送的函数中修改它们,它们将被修改回来。
对此的解决方案是在发送之前复制对象。但为此,我是否必须在对象类中创建一个复制函数?还是有其他选择?谢谢
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 中复制对象有一些有用的建议。
我通常为这种场景添加一个复制构造函数,如下所示:
public class MyObject {
//members
public MyObject(MyObject objectToCopy) {
this.member = objectToCopy.member;
//...
}
}
然后你可以用一个简单的衬里制作一个新对象。
public void DoWork(MyObject object) {
MyObject copy = new MyObject(object);
//do stuff
}
您应该自己为每个对象创建一个复制构造函数。原因很简单:如果 A 引用 B 并且您想复制 A,您是复制对 B 的引用还是复制整个引用的 B 对象?这个问题必须针对每个案例单独回答,因此没有通用的解决方案。
确实,您发送了对象,并且将对引用的对象进行更改。在 Java 中复制对象没有简单的“本机”方法,但您可以使用 Dozer 等框架复制对象: