首页 > 解决方案 > 你如何实例化具有相互循环引用的类,而不必在 Java 中使用“NULL”?

问题描述

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

class Ping {
    Pong value;

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

class Pong {
   Ping value;

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

有没有办法在不给构造函数NULL赋值的情况下创建 Pong 或 Ping 的实例?

标签: javacyclic-reference

解决方案


你可以使用这样的东西

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 在构造函数中泄漏 this。所以更好的实现是在创建 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);

推荐阅读