我试图将一个类实例传递给另一个类的构造函数,反之亦然。我想这样做:
static Map map = new Map(hero);
static Hero hero = new Hero(map);
我在我的 Game 类中运行这段代码。如何正确实现上述代码?有没有更好的方法来解决它?
编辑:
我认为我真正想要的是延迟加载,例如如果 map 为 null 则进行;否则,不要成功。我如何在 Java 中做到这一点?
我试图将一个类实例传递给另一个类的构造函数,反之亦然。我想这样做:
static Map map = new Map(hero);
static Hero hero = new Hero(map);
我在我的 Game 类中运行这段代码。如何正确实现上述代码?有没有更好的方法来解决它?
编辑:
我认为我真正想要的是延迟加载,例如如果 map 为 null 则进行;否则,不要成功。我如何在 Java 中做到这一点?
您可能会通过两阶段初始化来完成。
例如
static Map map = new Map();
static Hero hero = new Hero();
map.setHero(hero);
hero.setMap(map);
如果在setMap / setHero之前调用它们,则向相关函数添加警卫以引发“未完全初始化”异常
好吧,上面的语法不会编译,你会得到一个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,
榆树
你所拥有的是cyclic/circular dependency
。因此,您只需要在一个对象内初始化对象。最好的地方是Constructor
一个对象。
class Map {
Hero hero = null;
public Map() {
hero = new Hero(this);
}
public Hero getHero() {
return hero;
}
}
我强烈建议不要使用循环引用。
您可能会遇到序列化问题(例如,如果您想通过网络发送地图并将其存储在文件中。
我建议您为 MAP 和 Hero 对象设置一个唯一 ID。
并且您持有例如 Hero 一个“parentId”到它的 Map。
将人和英雄对象存储在一些缓存中(可能是基于 HashMap 的单例),这将允许您通过 id 检索对象,这样,给定一个英雄,您将能够很容易获得它的地图。
如果您仍然坚持循环引用,请参阅@logical chimp提供的答案
基本上,我这样做是为了让我永远不会在任何其他类中创建 World 类,并且我的 World 类会在需要时实例化其他类。
谢谢大家的帮助。