我对Java中的对象引用有疑问。它总是通过引用函数发送它的对象,这意味着如果你在发送的函数中修改它们,它们将会被修改。
解决方法是在发送之前复制对象。但为此,我是否必须在对象类中创建一个复制功能?还是其他任何选择?感谢
答案 0 :(得分:3)
我通常会为这种场景添加一个复制构造函数,如下所示:
public class MyObject {
//members
public MyObject(MyObject objectToCopy) {
this.member = objectToCopy.member;
//...
}
}
然后你可以用一个简单的衬垫制作一个新的物体。
public void DoWork(MyObject object) {
MyObject copy = new MyObject(object);
//do stuff
}
答案 1 :(得分:3)
Java始终是按值传递的。您所描述的是通过值传递对象引用。
这里有一个关键的区别。您没有将对象作为引用传递,因此引用链接已被破坏as soon as you assign a new instance to your parameter。只要参考值保持不变,当您返回给调用者时,更改传入的对象的内容将保持不变。另一个关键区别是参考值可以是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等库来准确创建对象的深层副本。 This question有一些关于用Java复制对象的有用建议。
答案 2 :(得分:1)
您应该自己为每个对象创建一个复制构造函数。原因很简单:如果A引用B而你想复制A,你会将引用复制到B或整个引用的B对象吗?这个问题必须针对每个案例单独回答,因此没有一般解决方案。
答案 3 :(得分:1)
确实发送了对象,并且将对引用的对象进行更改。在Java中复制对象没有简单的“本地”方法,但您可以使用Dozer等框架来复制对象: