在Java中重新分配其副本引用时更改原始对象

问题描述 投票:0回答:1

假设我有一个Game类:

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);
  }
}

问题是我的撤消方法不会将Game中我的棋盘状态重置为存储在堆栈中该特定命令的纪念品中的那个状态。之所以应该这样做,是因为我将Command中的板设置为memento中的备用板,并且Command中的板是Game中板的参考,因此后者也应更改。

我认为这是因为我说的时候正在发生>

    board = memento.getState();

我实际上是说董事会现在指向另一个参考,因此它将不再与Game中的董事会有任何关系。

如果我的假设是正确的,您是否知道如何在Game中制作棋盘,就像在memento中备份的棋盘一样?

P.S,我简化了课堂,希望我能体面地解释我的问题。

假设我有一个Game类:Public class Game {private Board board;私有堆栈commandStack; // ... // constructor ... // ...公共无效createCommamd(){...

java reference command memento
1个回答
0
投票

unexec方法应返回一个board:

© www.soinside.com 2019 - 2024. All rights reserved.