将内存分配给类的对象

时间:2010-12-28 22:24:33

标签: java

我有一个包含类对象的列表

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类进行更改。

3 个答案:

答案 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的新实例,则必须按照其他人的建议使用序列化。