包装对象

时间:2015-06-12 14:00:35

标签: java reference copy immutability

想象一下以下场景。 T类型的所有对象都是可复制的。有些包装器对象可能包含对T类型的许多对象或T的任何扩展类的引用。现在所有对象都包含在一个状态中,并且当使用任何包装器对象来修改所述状态时,预先复制状态。问题是包装对象指向原始状态对象而不是复制状态中的对象,因此对包装对象中包含的对象进行任何修改都会修改原始状态而不是复制状态。

有没有简单的方法可以解决这个问题?

示例:

class A extends T {
  private int value;

  public A(int value) {
     this.value = value;
  }

  public int getValue() {
     return value;
  }

  public void setValue(int toSet) {
     this.value = toSet;
  }

  @Override
  public A copy() {
     return A(this.value); //Imagine deep-copy stuff here
  }
}

现在假设一个State包含A的列表:

class Modification {
    A toModify;
    int toSet;
}

class State {
     List<A> objs = ...; // Some A's
     private State(State otherState) {
        //Deep-copy is done here...
        //Copy all A's that are contained in this state too
     }

     public State applyAModification(Modification mod) {
          State copy = new State(this);
          //now I want to modify the A that was referenced in mod
          //not the original, but the copy in the copied state
          return copy;
     }
}

更新:有人可能会指出我可能会搜索某些关键字的方向或点吗?这个问题似乎非常具体,但即使在试图解决这个问题很长时间之后,似乎也没有真正的解决方案。

编辑:请原谅所有错别字,呃

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是维护A类或其中的任何子类的版本,而不是从外部创建副本。例如:

class A extends T {
    List<A> versions = new ArrayList();
    private int value;

    public void setValue(int value) {
        versions.add(createCopy());
        this.value = value;
    }

    public A createCopy() {
        return deepCopycopyOfA;
    }
}

所以最后你还在处理只有1个引用A. 它还将封装在相应类中的每个突变上创建副本的复杂性。