0

以下のような複雑なオブジェクトの元に戻す/やり直し機能を記述する必要があります。

class DataContainer implements Serializable{

    private PublicationType type;
    private HashMap<Enum, String> fields;
    private HashMap<Enum, String> oFields;
    private HashMap<String, String> userFields;
    private String name;

    public DataContainer(PublicationType type, HashMap<Enum, String> fields, HashMap<Enum, String> oFields, HashMap<String, String> userFields, String name) {
        this.type = type;
        this.fields = fields;
        this.oFields = oFields;
        this.userFields = userFields;
        this.name = name;
    }
...
}

私はこのコードを開発しました。

public class ChangeManager<K> {
    int size = 0;
    Node<K> root;
    Node<K> current;
    int maxsize;

    public ChangeManager(K item) {
        size++;
        root = new Node<>(null, null, item);
        current = root;
    }
    public ChangeManager(K item, int maxsize) {
        size++;
        root = new Node<>(null, null, item);
        current = root;
        this.maxsize = maxsize+1;
    } 
    public void addChange(K item){
        size++;
        Node<K> tep  = current;
        current = new Node<>(tep, null, item);
        tep.nastepny = current;
        if(maxsize>1 &&maxsize<size){
            root = root.nastepny;
            root.poprzedni = null;
            System.gc();
        }
    }
    public void setMaxsize(int maxsize) {
        this.maxsize = maxsize+1;
    }
    public boolean canUndo(){
        if(current.poprzedni!=null)return true;
        return false;
    }
        public boolean canRedo(){
        if(current.nastepny!=null)return true;
        return false;
    }   
    public K undo(){
        if(canUndo()){
            size--;
            current = current.poprzedni;
            return current.obiekt;
        }else{
            throw new UnsupportedOperationException("Nothing to undo");
        }
    }
    public K redo(){
        if(canRedo()){
            size++;
            current = current.nastepny;
            return current.obiekt;
        }else{
            throw new UnsupportedOperationException("Nothing to redo");
        }
    }
    public int getSize(){
        return size;
    }

    public void trimToSize(int trim) {
        if (trim < size) {
            for (int i = 0; i < size - trim; i++) {
                root = root.nastepny;
                root.poprzedni = null;
                System.gc();
            }
        }
    }
    private class Node<K>{
        Node<K> poprzedni;
        Node<K> nastepny;
        K obiekt;

        public Node(Node<K> poprzedni, Node<K> nastepny, K obiekt) {
            this.poprzedni = poprzedni;
            this.nastepny = nastepny;
            this.obiekt = obiekt;
        }
    }
}

単純な文字列または整数値では問題なく機能しますが、複雑なオブジェクトでは機能しません。そのオブジェクトの代わりに参照が含まれているようです。それを機能させる方法や、元に戻す/やり直し機能を簡単にする方法はありますか?

4

0 に答える 0