Java反向/反向引用

时间:2012-10-20 12:32:26

标签: java

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

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

我在Game类中运行此代码。如何正确实现上述代码?有没有更好的方法呢?

修改

我认为我真正想要的是延迟加载,就像map是null然后制作它一样;否则,不要成功。我如何用Java做到这一点?

5 个答案:

答案 0 :(得分:4)

您可能会通过两阶段初始化来实现。

e.g。

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

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

然后在相关函数中添加防护,如果在 setMap / setHero

之前调用它们,则抛出“未完全初始化”的异常

答案 1 :(得分:4)

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

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

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

当然,命名你的setter的方式取决于你,如果它们的行为与真正的Java Bean setter一样,你应该坚持这个命名约定(即setX()getX())。如果Map \ Hero类在使用该setter之前无法使用,则可能是Builder Design Pattern的情况。

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

第三个选项是使用嵌套类(如果它符合您的设计),例如

class Map {
    class Hero { ... }
}

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

引用Map.this

HTH,
Elmes酒店

答案 2 :(得分:3)

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

class Map {
    Hero hero = null;

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

    public Hero getHero() {
        return hero;
    }
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

感谢大家的帮助。