我想复制一个对象,然后对其进行修改,但不更改原始对象。
我找到了这个解决方案,似乎最好的方法是使用复制构造函数-据我理解,这将给我一个深层拷贝(与原始对象完全分离的对象)。
所以我尝试了这个方法。但是,我注意到当下面的代码执行时,它会影响之前从中复制的所有对象。当我调用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();
}
}
那么问题到底是什么?复制构造函数不能这样工作吗?我编写的方式有问题吗?
Question
成为不可变对象,因为我不确定它是否是不可变的。我该如何做呢?编辑:也许这不是最好的主意,因为在Question
内部还有更多的不可变对象。我有点困惑。 - iaacpQuestion
变成不可变对象,那会有所帮助。如果它的所有字段已经是不可变类型,那应该会让这个过程更容易。 - Jon Skeet