如何将(JavaBean)对象的状态复制到另一个现有对象中?

时间:2013-06-11 15:17:23

标签: java object copy clone javabeans

图片中有一个类如下:

class Foo
{
   public String x;
   public int y;
   public long l;
}

然后我们有一个地方:

Foo foo1 = new Foo();
foo1.x = "a";
foo1.y = 3;
foo1.l = 2L;

然后在其他地方我们有另一个Foo对象,其字段尚未初始化。

Foo foo2 = new Foo();
//foo2 = foo1; 

鉴于将变量foo1表示的对象的引用分配给变量foo2不是我想要做的,因为我想保留对foo2所代表的对象的引用,最简单的方法是复制foo1到foo2的状态?

换句话说,我该如何自动执行此操作?

foo2.x = foo1.x;
foo2.y = foo1.y;
foo2.l = foo1.l;

6 个答案:

答案 0 :(得分:3)

如果Foo是一个JavaBean,如果它有适当的setter / getter而不是public字段,你可以使用Apache Commons Beanutils.copyProperties(Object dest, Object orig)

答案 1 :(得分:2)

Java中没有MOVE CORRESPONDING。你需要完整地写出来(或“其他一些黑客”)。

代码对于Java来说不是惯用的。那里有公共场所。处理这种情况的一种更好的方法可能是不可变的Foo。然后,您可以拥有一个引用Foo的对象,该对象是可变的。

答案 2 :(得分:1)

创建一个复制构造函数

class Foo
{
   public String x;
   public int y;
   public long l;

   public Foo(Foo foo){
       this.x = foo.x;
       this.y = foo.y;
       this.l = foo.l;
   }
}

现在您可以像

一样使用它
Foo foo1 = new Foo();
foo1.x = "a";
foo1.y = 3;
foo1.l = 2L;

Foo foo2 = new Foo(foo1);

您也可以通过实现克隆方法来完成此操作。但我认为创建复制构造函数是更好,更简单的方法。查看effective java

的此链接

答案 3 :(得分:0)

您可以实施 复制构造函数 ,例如

public Foo (Foo foo) {
   this.x = foo.getX();
   this.y = foo.getY();
   this.z = foo.getZ();
}

然后创建Foo的新副本为

Foo foo2 = new Foo(foo1);


或者,您可以让 Foo实现Cloneable 并将clone()定义为

public Foo clone() {
    return new Foo(this.x, this.y, this.z);
}

然后使用clone()创建副本

Foo foo2 = foo1.clone();

注意您可以跳过定义clone()(此处),因为默认 Object.clone()实施做了浅拷贝它可以使用你在这里的简单字段。

答案 4 :(得分:0)

Cloneable接口和复制构造函数外,还有另一种解决方案:freeze/thaw pattern

这是一种模式,允许您从对象中获取构建器,预先填充该对象的所有状态,根据需要进行修改,然后再次冻结。如果你实现它,你可以这样做:

final Foo foo2 = foo.thaw().freeze();

奖励点是Foo的所有实例都是不可变的:不再是setter!要修改:

final Foo foo2 = foo.thaw().setY(something).freeze();

这是JavaBeans,没有任何缺点和构建模式的强大功能。

答案 5 :(得分:0)

您可以让Foo实现Cloneable接口并覆盖方法clone。 在方法的主体中,您初始化一个新的Foo并将此Foo的字段值分配给新的Foo。