用Java引用对象

时间:2013-05-15 14:23:59

标签: java function reference

我对Java中的对象引用有疑问。它总是通过引用函数发送它的对象,这意味着如果你在发送的函数中修改它们,它们将会被修改。

解决方法是在发送之前复制对象。但为此,我是否必须在对象类中创建一个复制功能?还是其他任何选择?感谢

4 个答案:

答案 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
}

对于更复杂的对象图,您可能希望使用OrikaDozer等库来准确创建对象的深层副本。 This question有一些关于用Java复制对象的有用建议。

答案 2 :(得分:1)

您应该自己为每个对象创建一个复制构造函数。原因很简单:如果A引用B而你想复制A,你会将引用复制到B或整个引用的B对象吗?这个问题必须针对每个案例单独回答,因此没有一般解决方案。

答案 3 :(得分:1)

确实发送了对象,并且将对引用的对象进行更改。在Java中复制对象没有简单的“本地”方法,但您可以使用Dozer等框架来复制对象:

http://dozer.sourceforge.net/