Java: как компонент узнает своего владельца - PullRequest
1 голос
/ 17 февраля 2011

Предположим, у меня есть класс 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!";
    }
}

Я знаю, что могу получить B через A, потому что A имеет (или владеет ) B: new A().getB().
Но если у меня есть B, могу ли я получить A?

Ответы [ 8 ]

4 голосов
/ 17 февраля 2011

Конечно, просто добавьте подпрограмму getA() в ваш класс B и измените строку в конструкторе на

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

Это, конечно, предполагает, что в вашем классе B есть конструктор, который принимает A,например,

public B(A a) {
    this.a = a;
}
2 голосов
/ 17 февраля 2011

Неа.В Java нет такого понятия, как «владелец».На любой объект может ссылаться любое количество других объектов.

2 голосов
/ 17 февраля 2011

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);
}
1 голос
/ 17 февраля 2011

Если вам нужно, чтобы 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();

0 голосов
/ 17 февраля 2011

вы также можете использовать внутренние классы

пакетный тест;

открытый класс 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();
}

}

0 голосов
/ 17 февраля 2011

номер

Класс a имеет ссылку на класс B, но класс B не имеет ссылки на класс A. Ссылки являются только односторонними.

0 голосов
/ 17 февраля 2011

Нет, вы не можете. B не имеет отношения к A.

0 голосов
/ 17 февраля 2011

Нет, это невозможно. Вы ищете обратные ссылки, но мы должны создать их в коде, если это необходимо.

Если вы хотите собрать все ссылки на 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);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...