java - 如何在 Java 中实例化具有相互循环引用的类,而不必使用 `NULL`?

标签 java cyclic-reference

假设您有以下在 Java 中完全合法的类。

class Ping {
    Pong value;

    Ping(Pong value) { this.value = value; }
}

class Pong {
   Ping value;

   Pong(Ping value) { this.value = value; }
}

有没有办法创建 Pong 或 Ping 的实例而不给它们的构造函数 NULL值?

最佳答案

你可以使用这样的东西

class Ping {
    Pong value;
    Ping() {this.value = new Pong(this)}
    Ping(Pong value) {this.value = value}
}
class Pong {
    Ping value;
    Pong() {this.value = new Ping(this)}
    Pong(Ping value) {this.value = value}
}

遗憾的是,这似乎是一种不好的做法,如下所述:Java leaking this in constructor 。因此,更好的实现是在创建 Ping 之后分配 Pong。

class Ping {
    Pong value;
    Ping() {}
    Ping(Pong value) {this.value = value}
    public setPong(Pong pong) {
        this.value = pong;
    }
}
class Pong {
    Ping value;
    Pong() {}
    Pong(Ping value) {this.value = value}
    public setPing(Ping ping) {
        this.value = ping;
    }
}
Ping ping = new Ping();
Pong pong = new Pong(ping);
ping.setPong(pong);

关于java - 如何在 Java 中实例化具有相互循环引用的类,而不必使用 `NULL`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61330718/

相关文章:

java - web.xml 的 <web-app> 中的属性在 Eclipse 中不起作用

perl - 使用Scalar::Util 的弱化会导致无效引用问题吗?

C++循环继承依赖

java - 匿名类和父类之间的循环依赖是错误的吗?

go - 有没有办法用encoding/gob序列化循环数据结构?

java - 在 jackson 生成的 json 中包装 Protocol Buffer 时 java 出错?

java - 我们可以调用 java 代码 "literals"之外的号码吗?

Java 按最大可能的 AABB 对图 block 矩阵进行分组

java - 包 org.jetbrains.annotations 不存在

c++ - 循环模板