【问题标题】:Change original object when reassigning its copy-reference in java在java中重新分配其复制引用时更改原始对象
【发布时间】:2020-03-25 12:26:18
【问题描述】:

假设我有一个游戏类:

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

一个将棋盘作为构造函数参数来初始化其字段的命令类:

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设置为memento中的备用板,并且由于Command中的board是Game中board的引用,后者也应该更改。

我认为这是因为当我说

    board = memento.getState();

我实际上是说棋盘现在指向另一个引用,因此它将不再与游戏中的棋盘有任何关系。

如果我的假设是正确的,你知道我怎样才能让游戏中的棋盘像纪念品中备份的棋盘一样吗?

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

【问题讨论】:

  • 什么是DeepCopy?是你的代码吗?图书馆课?哪个图书馆...
  • @giulio 我认为你是对的。 Command, unexec() 不应该返回板而不是 void 吗?
  • @StephenC 是的,这是我的代码。这部分工作正常......只是一种深度复制内存地址单元格中的字节的方法。
  • @AndyMan 对不起,我不明白你所说的“不应该指挥”是什么意思。
  • 您需要为此问题提供正确的minrep

标签: java reference command memento


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-12-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2018-09-05
    • 2022-09-21
    • 2017-06-12
    • 2015-02-14
    • 1970-01-01
    相关资源
    最近更新 更多