簡體   English   中英

在 java 中重新分配其復制引用時更改原始對象

[英]Change original object when reassigning its copy-reference in java

假設我有一個游戲類:

Public class Game{
    private Board board;
    private Stack<Command> commandStack;
    //...
    //constructor... 
    //...
    Public void createCommamd() {
        Command command = new Command(board);
        command.exec();
        commandStack.push(command);
} 
    public void undo() {
        Command command = commandStack.get(undoRedoPointer);
        board = command.unexec();
        undoRedoPointer--;
}
      public void redo(){
        undoRedoPointer++;
        Command command = commandStack.get(undoRedoPointer);
        command.exec();
}

一個 Command 類,它將板作為構造函數參數來初始化其字段:

public class Command{
    private Board board;
    private Memento memento;

    public Command(Board board){
       this.board = board;
    }

    public void exec(){
        memento = new Memento();
        memento.setState(board);
        board.addColumn(col);
    }

    public void unexec(){
        board = memento.getState();
    }
}

我的小紀念品類是為了在每次更改之前保存板的狀態(它有點支持它):

public class Memento{
  private Object boardState;

  public Board getState(){
    return (Board) boardState;
  }

  public void setState(Board board){
      Object obj = board;
      this.boardState = DeepCopy.copy(obj);
  }
}

問題是我的撤消方法不會將我在游戲中的棋盤狀態重置為存儲在堆棧中該特定命令的備忘錄中的狀態。 它應該這樣做是因為我在 Command 中將 board 設置為備忘板,並且由於 Command 中的 board 是 Game 中的 board 的參考,因此后者也應該改變。

我認為這正在發生,因為當我說

    board = memento.getState();

我實際上是說 board 現在指向另一個引用,因此它將不再與 Game 中的 board 有任何關系。

如果我的假設是正確的,你知道我如何讓游戲中的棋盤像紀念品中備份的棋盤一樣嗎?

PS 我已經簡化了課程,希望我能很好地解釋我的問題。

unexec 方法應該返回一個板:

public class Command{
    private Board board;
    private Memento memento;

    public Command(Board board){
       this.board = board;
    }

    public void exec(){
        memento = new Memento();
        memento.setState(board);
        board.addColumn(col);
    }

    public Board unexec(){
        board = memento.getState();
        return board;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM