考虑到对象是可变的,我正在尝试创建一个副本构造函数。我的复制构造函数是错误的;我似乎无法弄清楚我在做什么错。

请不要告诉我使用clone()。在这种情况下,我将如何完成复制构造函数?我是Java新手,非常感谢您的帮助。

public class MyList {


public ArrayList<Cool> people;

/**
 * "people" variable as a new (empty) ArrayList of Cool objects.
 */
public MyPersonList()
{
    people = new ArrayList<Cool>(0);
}


/**
 * A copy constructor which makes the right kind of copy considering
 * a Cool is mutable.
 */
public MyList(MyList other)
{
    people = new ArrayList<Cool>();

    for(Cool p:people)
    {
        people.add(p);
    }

}

最佳答案

注意:克隆列表与克隆列表中的元素不同。

这些方法都不符合您希望的方式:

//1
people = new ArrayList<Cool>(other.people);

//2
people = new ArrayList<Cool>();
for(Cool p : other.people) {
    people.add(p);
}

上面的方法将填充people,使其包含与other.people相同的元素。

但是,您不希望它包含相同的元素。您想用other.people中元素的克隆填充它。

最好的方法是这样的:
people = new ArrayList<Cool>(other.people.size());
for(Cool p : other.people) {
    people.add((Cool)p.clone());
}

确保Cool实现Cloneable。如有必要,覆盖clone()

09-05 02:53