Java:可能有相互的最终类引用吗?

Div*_*ero 7 java final class

假设我有两个名为A和B的类,它们彼此相关联,这样如果每个类的对象包含对另一个类的引用,则最方便.换句话说,类A具有类B的变量"b".类B具有类A的变量"a".这样,每个类中的代码可以容易地访问另一个类.

有没有办法将这种关联设置为"最终"?即A类中的变量b是最终的,B类中的变量a是最终的?似乎在构造函数中设置这些引用(如final关键字所要求的那样)需要一个不合逻辑的循环引用.

这更像是一个概念问题,而不是一个实际问题.谢谢!

Ima*_*ist 6

作为另一个海报指出的那样,它可以通过使负责构建其他和它本身传递到构造为其他对象中的一个类来做到这一点.

但是,如果您希望第一个类的一个实例对应于第二个类的一个实例(您可能会这样做),这本身就会带来潜在的问题.另一个对象可能会将对第一个类的现有引用传递给第二个类的构造函数,从而允许无效的情况(第二个类的实例现在引用了引用不同实例的第一个类的实例.第二课).

当您考虑第二类的构造函数不能引用第一类的未初始化成员时,会出现更多潜在问题.

我的建议是,如果这两个类是如此相互关联,你希望它们各自具有对另一个的最终引用,那么只需使它们成为同一个类.然后你总是得到另一个对象的最终引用:this.


mse*_*ell 6

是的,如果其中一个类负责创建另一个类的实例,则是可能的.第一个构造函数可以将自身的实例作为第二个类的参数传递.

public class A {
    final B b;
    public A() {
        b = new B(this);
    }
    public B getB() {
        return b;
    }
}
public class B {
    final A a;
    public B(A a) {
        this.a = a;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然这种方法可能有效,但它可能很危险,因为B构造函数正在接收对尚未完全构造的元素的引用.例如,假设A有另一个在*'b'之后初始化*的字段,并且B构造函数试图访问它.它将获得一个未初始化的对象.从B构造函数调用A的方法也是如此,或者如果A稍后被扩展...也许重新设计将是更好的选择. (4认同)