Java反向/反向引用

Java反向/反向引用,java,Java,我试图将一个类实例传递给另一个类的构造函数,反之亦然。我想这样做: static Map map = new Map(hero); static Hero hero = new Hero(map); 我在游戏类中运行这些代码。如何正确地实现上述代码?有没有更好的办法 编辑: 我想我真正想要的是延迟加载,比如如果map为null,那么就进行加载;否则,就别做了。如何在Java中实现这一点?您可能会通过两阶段初始化来实现 e、 g 然后向相关函数添加保护,如果在setMap/setHero之前调用

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

static Map map = new Map(hero);
static Hero hero = new Hero(map);
我在游戏类中运行这些代码。如何正确地实现上述代码?有没有更好的办法

编辑:


我想我真正想要的是延迟加载,比如如果map为null,那么就进行加载;否则,就别做了。如何在Java中实现这一点?

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

e、 g


然后向相关函数添加保护,如果在setMap/setHero之前调用它们,则抛出“未完全初始化”异常。我强烈建议不要使用循环引用
您可能会遇到序列化问题(例如,如果希望通过网络发送地图并将其存储在文件中)。
我建议您为地图和英雄对象设置一个唯一的ID。
例如,您可以在其地图上为Hero保留一个“parentId”。
将人和英雄对象存储在某个缓存中(可能是基于HashMap的单例缓存),这样您就可以按id检索对象,这样,给定一个英雄,您就可以非常轻松地获取其映射。

如果您仍然坚持循环引用,请参见@logical chimp提供的答案,您所拥有的是
循环/循环依赖关系
。因此,您只需要在一个对象内初始化对象。最好的方法是对一个对象进行
构造函数

class Map {
    Hero hero = null;

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

    public Hero getHero() {
        return hero;
    }
}

好的,上面的语法不会编译,您会得到一个
非法的正向引用
编译错误

你能做的就是构造两个对象,然后设置参考,例如

static Map map = new Map();
static Hero hero = new Hero();
// and then ...
map.hero(hero);
hero.map(map);
当然,命名setter的方式取决于您自己,如果这些setter的行为像真正的JavaBean setter,那么您可能应该坚持这种命名约定(即
setX()
getX()
)。如果在使用该setter之前,中的
映射
\
Hero
类不可用,那么可能就是这种情况

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

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

这样,每个英雄都可以通过
Map获得对
Map的引用

HTH,

elmes

基本上,我这样做是为了不在任何其他类中创建世界类,并且如果需要,我的世界类将实例化其他类


谢谢大家的帮助。

你可以在地图构造器中创建英雄,或者你可以接受答案?或者你可以使用@logical Chimp提供的建议。我认为循环引用/依赖性是有问题的。你最好向他指出这是个问题。@zaske搬到setter总是很好的,但如果他做过som的话在特定于其他对象的构造函数中设置ething,那么在使用setter时就会出现问题。我认为这是有意义的,因为每个地图,现在我称之为World,都会有一个英雄。我认为在Map类中创建英雄,在我读到每个人的评论后重命名为World,这是一个合乎逻辑的选择,因为每个世界都会有一个英雄。你认为呢这有什么意义?我不能肯定,这真的取决于你正在设计的游戏。我会再三考虑,是否真的有必要有一个循环参考….?为什么
世界
需要知道它的
英雄
为什么英雄
需要知道它的
世界
?英雄需要知道他在世界的什么地方ld和他是世界的一部分。你可以像这样尝试smt,然后简单地适应变化和你的需要。还有,看看这个。我想
英雄
不需要整个
世界
,也许可以在英雄需要时向他传递一个单独的
世界位置
实例。。
static Map map = new Map();
static Hero hero = new Hero();
// and then ...
map.hero(hero);
hero.map(map);
class Map {
    class Hero { ... }
}