3

我试图将一个类实例传递给另一个类的构造函数,反之亦然。我想这样做:

static Map map = new Map(hero);
static Hero hero = new Hero(map);

我在我的 Game 类中运行这段代码。如何正确实现上述代码?有没有更好的方法来解决它?

编辑:

我认为我真正想要的是延迟加载,例如如果 map 为 null 则进行;否则,不要成功。我如何在 Java 中做到这一点?

4

5 回答 5

4

您可能会通过两阶段初始化来完成。

例如

static Map map = new Map();
static Hero hero = new Hero();

map.setHero(hero);
hero.setMap(map);

如果在setMap / setHero之前调用它们,则向相关函数添加警卫以引发“未完全初始化”异常

于 2012-10-20T12:36:03.447 回答
4

好吧,上面的语法不会编译,你会得到一个illegal forward reference编译错误。

可以做的是构造两个对象,然后设置引用,例如

static Map map = new Map();
static Hero hero = new Hero();
// and then ...
map.hero(hero);
hero.map(map);

当然,您命名设置器的方式取决于您,如果它们的行为类似于真正的 Java Bean 设置器,您可能应该坚持该命名约定(即setX()getX())。如果Map\Hero类在使用该 setter 之前不可用,那么可能是Builder Design Pattern的情况。

另一种选择是使用一些依赖注入库,它会在幕后为您处理上述事情。

第三种选择是使用嵌套类(如果它适合您的设计),例如

class Map {
    class Hero { ... }
}

这样每个英雄都Map可以通过Map.this

HTH,
榆树

于 2012-10-20T12:41:21.163 回答
3

你所拥有的是cyclic/circular dependency。因此,您只需要在一个对象内初始化对象。最好的地方是Constructor一个对象。

class Map {
    Hero hero = null;

    public Map() {
        hero = new Hero(this);
    }

    public Hero getHero() {
        return hero;
    }
}
于 2012-10-20T12:37:17.653 回答
0

我强烈建议不要使用循环引用。
您可能会遇到序列化问题(例如,如果您想通过网络发送地图并将其存储在文件中。
我建议您为 MAP 和 Hero 对象设置一个唯一 ID。
并且您持有例如 Hero 一个“parentId”到它的 Map。
将人和英雄对象存储在一些缓存中(可能是基于 HashMap 的单例),这将允许您通过 id 检索对象,这样,给定一个英雄,您将能够很容易获得它的地图。
如果您仍然坚持循环引用,请参阅@logical chimp提供的答案

于 2012-10-20T12:36:20.150 回答
0

基本上,我这样做是为了让我永远不会在任何其他类中创建 World 类,并且我的 World 类会在需要时实例化其他类。

谢谢大家的帮助。

于 2012-12-06T21:19:04.187 回答