java – 如何复制对象同时保持一致的引用?

前端之家收集整理的这篇文章主要介绍了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;
    ...
}

这将作为对所有需要引用的对象的引用.
并且每个GameObject将获得唯一的ID,级别将具有将每个id链接到实际的GameObject(类似于GameObject Level.getObject(long id))的映射.虽然这可能会起作用,但我仍然觉得必须有更好的解决方案.

编辑:进一步澄清

看来我没有把我的问题清楚得足够清楚,所以我会简化和概括一下:

我有两个示例对象(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.

猜你在找的Java相关文章