7

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

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

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

4

3 回答 3

6

正如另一位发帖人指出的那样,可以通过使其中一个类负责构造另一个类并将其自身传递给另一个对象的构造函数来做到这一点。

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

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

我的建议是,如果这两个类是如此相互关联,以至于您希望它们每个都具有对另一个的最终引用,则只需将它们设为相同的 class。然后你总是得到对另一个对象的最终引用:this.

于 2009-08-21T04:33:36.183 回答
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;
    }
}
于 2009-08-21T05:06:57.287 回答
1

如果您使用诸如 guice 之类的 Di 容器,则无需在构造函数内部传递明显的引用即可实现这一点 - 如前所述,这可能容易出错。

声明依赖 ab 和 ba 并将其中一个注入另一个类。guice 会做一些神奇的事情,让这两个领域都是最终的。基本上它会先注入一个代理,然后再设置它的委托人。

你需要一个代码示例吗?

于 2009-08-21T06:24:00.703 回答