我正在尝试将类实例传递给另一个类的构造函数,反之亦然。我想这样做:
static Map map = new Map(hero);
static Hero hero = new Hero(map);
我在Game类中运行此代码。如何正确实现上述代码?有没有更好的方法呢?
修改
我认为我真正想要的是延迟加载,就像map是null然后制作它一样;否则,不要成功。我如何用Java做到这一点?
答案 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类会在需要时实例化其他类。
感谢大家的帮助。