图片中有一个类如下:
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;
答案 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。