我有一个包含类对象的列表
List a[10];
class Hello extends abc implement xyz
{
String mesg1;
String mesg2;
Object c;
Goodbye d;
// also their getter setters
}
a [5]包含Hello类
的对象我必须在位置1复制对象实例然后在mesg1和mesg2中进行一些更改并在最后将它插入到同一列表中。我试图这样做,但是我们知道它只存储那里的引用所以我最终也改变了位置1的mesg1和mesg2。
有什么建议吗? 我尝试使用clone()但不能对此类或Hello类进行更改。
答案 0 :(得分:7)
您必须提供自己的clone
或复制构造函数作为Hello
类的一部分。
E.g。 (clone
):
public Hello clone() {
Hello h;
h = new Hello();
h.mesg1 = this.mesg1;
h.mesg2 = this.mesg2;
h.c = this.c; // Or a deep copy if appropriate
h.d = this.d; // Or a deep copy if appropriate
return h;
}
或(复制构造函数):
public Hello(Hello original) {
this.mesg1 = original.mesg1;
this.mesg2 = original.mesg2;
this.c = original.c; // Or a deep copy if appropriate
this.d = original.d; // Or a deep copy if appropriate
}
然后使用它
a[5] = new Hello();
// set its members
a[1] = a[5].clone(); // or = new Hello(a[5]);
// set its members
答案 1 :(得分:1)
您希望克隆/复制现有对象,并修改副本,而不更改Hello.class
的代码?
如果您可以使用其中一个构造函数创建Hello类的新实例,那么这将是最简单的解决方案。一些数据结构具有所谓的复制构造函数,例如:
Hello original = new Hello();
Hello duplicate = new Hello(original);
如果类没有这样的构造函数,您可以尝试使用反射创建一个新实例。有些库可以克隆对象并将其属性从一个对象复制到另一个对象,例如:
Hello duplicate = BeanUtils.instantiate(original.getClass());
org.springframework.beans.BeanUtils.copyProperties(original, duplicate);
甚至更容易,commons-lang的实用方法:
Hello duplicate = org.apache.commons.lang.SerializationUtils.clone(original);
答案 2 :(得分:0)
如果对象不是太大,您可以为Hello
类编写自定义克隆方法,如下所示:
static Hello cloneHello(Hello h){
Hello newHello = new Hello();
//for primitive and immutable types
newHello.setMsg1(h.getMsg1());
newHello.setMsg1(h.getMsg2());
//for mutable objects you can provide cloneMyObject(MyObject o) for each type
newHello.setMyObject(cloneMyObject(h.getMyObject()));
//and so on ..
return newHello;
}
这可能会变得乏味,但应该做到这一点。
如果您无法创建Hello
的新实例,则必须按照其他人的建议使用序列化。