Java:组件如何知道其所有者

时间:2011-02-16 21:54:34

标签: java ownership

假设我有一个班级A和一个班级B

public class A {

    private B b;

    public A() {
        this.b = new B();
    }

    public B getB() {
        return this.b;
    }
}

public class B {

    public String getSome() {
        return "Get some!";
    }
}

我知道我可以通过A获得B,因为A (或拥有)B:new A().getB()
但如果我有B,我可以得到A吗?

8 个答案:

答案 0 :(得分:4)

当然,只需在B类中添加例程getA(),然后将构造函数中的行更改为

public A() {
    this.b = new B(this);
}

这当然假设您的B类有一个接受A的构造函数,例如

public B(A a) {
    this.a = a;
}

答案 1 :(得分:2)

B需要明确引用其所有者:

public class B {
  private final A owner;

  public B(A owner) {
    this.owner = owner;
  }

  public A getOwner() {
    return owner;
  }
}

A

public A() {
  b = new B(this);
}

答案 2 :(得分:2)

不。在Java中没有“所有者”这样的东西。任何对象都可以由任意数量的其他对象引用。

答案 3 :(得分:1)

如果你需要B总是绑定到A的实例,那么使B成为A:

的内部类
class A {

    B b = new B();

    class B {
        String getSome() {
            // this will refer to the enclosing A
            return A.this.toString();
        }
    }
}

内部(非静态)类始终具有对封闭实例的隐式引用,没有它就不能存在。为了从外部实例化B,您需要一个讨厌的语法:B b = new A().new B();

答案 4 :(得分:0)

不,那是不可能的。您正在寻找反向引用,但如果需要,我们必须在代码中创建它们。

如果要收集B的所有引用,可以使用构造函数或创建B的工厂(模式)来执行此操作。我将展示工厂:

public class B {

   private static Set<? extends Object> referencers = new HashSet<? extends Object>();
   private B(){}  // no public constructor
   public static create(Object parent) {
     // cooperative approach, the caller should pass "this"
     referencers.add(parent);
   }
   public static remove(Object parent) {
     referencers.remove(parent);
   }
}

答案 5 :(得分:0)

不,你不能。 B没有提到A。

答案 6 :(得分:0)

没有

类a引用了类B,但类B没有引用类A.引用只是一种方式。

答案 7 :(得分:0)

你也可以使用内部类

包裹测试;

公共类A {

B b = null;

public B getB()
{
    return b;
}

public class B {

    public A getA()
    {
        return A.this;
    }
}

public static void main(String[] args) {
    B b = new A().new B();
}

}