2 回答

TA貢獻1852條經驗 獲得超7個贊
但是,如何使新對象成為一個獨立的實例。
刪除關鍵字可使對象內的字段獨立于其他對象。static
如果字段/變量是,它將與該類的所有實例共享其值。如果更改其中一個實例,則會更改所有實例的值。static
我認為主要問題是你對對象的復制。您實際上并沒有復制任何內容,只是將引用傳遞給另一個實例。State
您需要一個方法,該方法還可以復制本身必須復制的所有字段的實例。deepCopy
必須在作為新對象一部分的所有字段中進行深度復制。在這里,您必須復制 , 的 , 等等。對于基元數據類型,您的副本可以按原樣工作。Board
Player
Move

TA貢獻1833條經驗 獲得超4個贊
// Copy constructor
public State(State state) {
this.parent = state.parent;
this.depth = state.depth;
this.board = state.board;
this.children = state.children;
this.turn = 1 - state.turn;
this.player1 = state.player1;
this.player2 = state.player2;
// shallow copy
// this.subjects = student.subjects;
// deep copy - create new instance of HashSet
// this.subjects = new HashSet<>(state.subjects);
}
您的復制構造函數不會創建副本。您提供對另一個對象的引用,并且它們指向相同的父對象,深度,板,子對象等。您應該為每個對象創建另一個復制構造函數,直到基元類型。例如,如果電路板包含兩個整數:
class Board {
int a;
int b;
public Board(Board board){
this.a = board.a;
this.b = board.b;
}
只需使用此構造函數:
this.board = new Board(state.board);
而不是:
this.board = state.board;
添加回答
舉報