Использование шаблона memento для восстановления вектора в java

#java #memento

Вопрос:

Я пытаюсь сохранить вектор и использовать метод отмены для восстановления вектора с помощью шаблона на память, но это не работает. Caretaker.java:

 import java.util.*; public class Caretaker {  private Vector lt;Mementogt; undoList= new Vectorlt;Mementogt;();  public Caretaker() {}  public void saveMyClass(MyClass mc){  undoList.add(new Memento(mc));  }    public void undo(){  undoList.lastElement().restore();  undoList.remove(undoList.lastElement());  } }  

Memento.java:

  public class Memento {  private MyClass myclass;  private Vector mState;  public Memento(MyClass mc) {  this.myclass=mc;  mState=mc.state;  }  public void restore()  {  myclass.state=this.mState;  }     }  

MyClass.java:

  public class MyClass { Vector state=new Vectorlt;gt;();  public MyClass() {    }  public Vector getState(){  return state;  }  public void doAction(int i){  state.add(i);  } }  

TestMemento.java:

 public static void main(String args[]) {  Caretaker ct = new Caretaker();  MyClass mc = new MyClass();  System.out.println("Create a my class object with state 1");  System.out.println("Current state : "   mc.getState());  ct.saveMyClass(mc);  mc.doAction(3);  System.out.println("Change my class object to state 2");  System.out.println("Current state : "   mc.getState());  ct.saveMyClass(mc);  mc.doAction(5);  System.out.println("Change my class object to state 3");  System.out.println("Current state : "   mc.getState());  ct.saveMyClass(mc);  mc.doAction(7);  System.out.println("Change my class object to state 4");  System.out.println("Current state : "   mc.getState());  ct.undo();  System.out.println("Perform undo");  System.out.println("Current state : "   mc.getState());  ct.undo();  System.out.println("Perform undo");  System.out.println("Current state : "   mc.getState());  } }  

Результат:

 Current state : [] Change my class object to state 2 Current state : [3] Change my class object to state 3 Current state : [3, 5] Change my class object to state 4 Current state : [3, 5, 7] Perform undo Current state : [3, 5, 7] Perform undo Current state : [3, 5, 7]  

В результате я предпочитаю перейти в предыдущее состояние после отмены. Но это не работает. В той же ситуации я изменил вектор на состояние int

 public void doAction(){  state  ;  }  

Тогда я смогу получить результат

 Create my class object with state 1 Current state : 0 Change my class object to state 2 Current state: 1 Change my class object to state 3 Current state: 2 Change my class object to state 4 Current state : 3 Perform undo Current state: 2 Perform undo  Current state: 1  

Комментарии:

1. Вы должны клонировать или копировать свои объекты, чтобы сохранить их в своем классе запоминающего устройства. В настоящее время вы сохраняете только указатели, если я прав. Например, MState=новый вектор(mc. состояние)

2. Это работает! Большое спасибо