我想複製一個對象,然後將被修改,而無需更改原始對象。複製一個對象在Java中,而不會影響原始通過複製構造函數
我發現this solution它似乎最好的方法是複製構造函數 - 從我的理解,這會給我一個深層複製(與原始的完全獨立的對象)。
所以我試過了。但是,我注意到,當下面的代碼執行時,它會影響所有以前從中複製的對象。當我撥打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();
}
}
那麼究竟是什麼問題?複製構造函數是不是以這種方式工作?我編碼錯了嗎?
它*絕對*複製參考 – mishadoff
我明白你的觀點。我試圖說明該方法可以返回一個防禦副本(即它會創建一個副本,然後返回它)。無論如何,參考副本將在某處發生 –
@mishadoff - 不一定。我們沒有看到getter代碼,並且一些getter實際上創建了一個防禦副本(對於深度克隆來說,這可以很好地工作)。 「我認爲,」很可能複製了參考文獻「是一個正確的解釋。 – mikera