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

时间:2009-08-21 03:56:33

标签: java class final

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

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

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

3 个答案:

答案 0 :(得分:6)

正如另一张海报指出的那样, 可以通过使其中一个类负责构造另一个并将其自身传递给另一个对象的构造函数来实现这一点。

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

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

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

答案 1 :(得分: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;
    }
}

答案 2 :(得分:1)

如果使用像guice这样的Di容器,你可以在构造函数内部没有明显的引用传递的情况下解决这个问题 - 这可能是错误的,如前所述。

声明依赖关系a-b和b-a并在另一个类中注入其中一个。 guice会做一些魔术让两个领域都是最终的。基本上它会首先注入一个代理并稍后设置它的委托者。

你需要一个代码示例吗?