java – 如何复制对象同时保持一致的引用?
我想为我正在开发的游戏实现一个检查点系统,为了创建级别的独立副本,我需要复制一个级别中的所有可变对象.在一个简化的例子中,我的类看起来像这样:
public class GameObject { ... private Level level; ... } public class Level { ... private List<GameObject> gameObjects; ... } 但是有一个问题:当我想要复制一个级别及其对象时,引用变得不一致.例如,我可以深入复制我的Level-instance并深入复制所有的gameObjects.但是当我这样做时,GameObject中的Level-reference不再指向“right”(新)级别.在这种情况下,我可以调用每个对象的方法并重置其级别.但是,越来越多的类型的对象会被启动,这将越来越复杂,因为对象可能有也可能没有自己创建的对象集合,因此这些引用也必须被更新. 有没有什么像这样的情况的设计模式,或任何Java特定的,使这个问题更容易? 编辑 我只是一个想法:如何为每个GameObject创建一些类似的包装类,如下所示: public class GameObjectWrapper { ... private long gameObjectID; private Level level; ... } 这将作为对所有需要引用的对象的引用. 编辑:进一步澄清 看来我没有把我的问题清楚得足够清楚,所以我会简化和概括一下: 我有两个示例对象(objectA和objectB):objectA包含对objectB的引用,objectB包含对objectA的引用. 这样的事情 public class MyObject { private MyObject partner; ... public MyObject shallowCopy() { return new MyObject(partner); } } 我想复制两个.使用浅拷贝,我得到两个新对象:newObjectA和newObjectB. newObjectA的存储引用(应该指向newObjectB),但是仍然指向原始对象B,反之亦然. MyObject objectA = new MyObject(),objectB = new MyObject(); objectA.setPartner(objectB); objectB.setPartner(objectA); MyObject newObjectA = objectA.copy(); //newObjectA's partner now is objectB (instead of newObjectB) MyObject newObjectB = objectB.copy(); //newObjectB's partner now is objectA (instead of newObjectA) 现在,我可以“只是”运行我的所有对象,并将他们的旧对象映射到新的对象,但这似乎是缓慢而且太复杂的解决方案.最简单和最有效的解决方法是什么? 注意:我认为这是发布到gamedev.stackexchange.com,但我发现这更像是一个编程和设计的具体问题,而不是游戏开发的具体问题. 解决方法
如果您只复制了Level对象,并希望其列表中的引用指向新的副本,则不能以复制方式循环遍历它们.
这样的东西 class Level { List<GameObject> gameObjects; Level copy() { Level level = new Level(); level.gameObjects = new ArrayList<>(gameObjects.size()); for (GameObject gameObject : gameObjects) { level.gameObjects.add(gameObject.copyWithReference(level)); } return level; } } class GameObject { Level level; GameObject copyWithReference(Level level) { GameObject gameObject = new GameObject(); gameObject.level = level; return gameObject; } } 编辑: 你可以有一个容器的gameObjects: class GameObjectSet { Level level; List<GameObject> gameObjects; GameObjectSet copy(Level newLevel) { GameObjectSet gameObjectSet = new GameObjectSet(); gameObjectSet.level = newLevel; // copy all gameObjects and make them point to new gameObjectSet return gameObjectSet; } } 现在您将在Level类和GameObject类中引用GameObjectSet. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |