首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包装器中的不可变对象引用-对象

包装器中的不可变对象引用-对象
EN

Stack Overflow用户
提问于 2015-06-12 22:00:35
回答 1查看 155关注 0票数 0

想象一下下面的场景。所有T类型的对象都是可复制的。有一些包装器对象,其中可能包含对许多T类型的对象或T的任何扩展类的引用。现在所有对象都包含在一个状态中,当任何包装器对象被用来修改所述状态时,该状态将被预先复制。问题是包装器对象指向原始状态对象,而不是处于复制状态的对象,从而对包装器中包含的对象进行任何修改-对象修改原始状态而不是复制状态。

有什么简单的方法可以克服这个问题吗?

示例:

代码语言:javascript
复制
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

代码语言:javascript
复制
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;
     }
}

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

编辑:原谅所有的打字错误,废话

EN

回答 1

Stack Overflow用户

发布于 2015-06-12 22:50:58

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

代码语言:javascript
复制
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的引用,它还会封装在相应类中的每个突变上创建副本的复杂性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30804950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档