我正在尝试复制一个对象,然后对其进行修改,而不更改原始对象。
I found 这个解决方案似乎最好的方法是复制构造函数 - 根据我的理解,这会给我一个深层复制(与原始对象完全独立的对象)。
所以我尝试了。但是,我注意到,当执行以下代码时,它会影响从中复制它的所有先前对象。当我打电话时surveyCopy.take()
,这将改变内部的值Survey
,它还会更改 selectedSurvey 内部的值。
public class MainDriver {
...
//Code that is supposed to create the copy
case "11": selectedSurvey = retrieveBlankSurvey(currentSurveys);
Survey surveyCopy = new Survey(selectedSurvey);
surveyCopy.take(consoleIO);
currentSurveys.add(surveyCopy);
break;
}
这是我的复制构造函数的代码:
public class Survey implements Serializable
{
ArrayList<Question> questionList;
int numQuestions;
String taker;
String surveyName;
boolean isTaken;
//Copy constructor
public Survey(Survey incoming)
{
this.taker = incoming.getTaker();
this.numQuestions = incoming.getNumQuestions();
this.questionList = incoming.getQuestionList();
this.surveyName = incoming.getSurveyName();
this.isTaken = incoming.isTaken();
}
}
那么到底是什么问题呢?复制构造函数不能那样工作吗?难道是我编码方式不对?
这就是您的复制构造函数中的问题:
this.questionList = incoming.getQuestionList();
这只是复制参考到列表中。两个对象仍然引用同一个对象。
您可以使用:
this.questionList = new ArrayList<Question>(incoming.getQuestionList());
创建原始列表的副本 - 但这是still还不够好如果Question
本身是可变的。在这种情况下,您必须为每个创建一个副本Question
目标实现完全隔离。
您的其他字段没问题,因为它们要么是原语,要么是对String
(这是不可变的,允许您安全地共享引用)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)