想象一下下面的场景。所有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
}
}现在假设有一个包含这些A列表的State
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;
}
}更新:有人可以给我指出一些我可能搜索的关键字的方向或点吗?这个问题似乎很具体,但即使在尝试解决这个问题很长时间后,似乎也没有真正的解决方案。
编辑:原谅所有的打字错误,废话
发布于 2015-06-12 22:50:58
一种可能的解决方案是维护类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;
}
}所以到最后,你仍然只需要处理一个对A的引用,它还会封装在相应类中的每个突变上创建副本的复杂性。
https://stackoverflow.com/questions/30804950
复制相似问题