Как передать самостоятельную ссылку на конструкторы в Java? - PullRequest
1 голос
/ 01 июля 2010

у меня есть класс A, которому нужно создать экземпляр второго класса B, чей конструктор должен ссылаться на тот же объект класса A ...

будет выглядеть так:

public class A {
    B b;

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

public class B {
    A a;

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

хорошо - затмение продолжает жаловаться, что это невозможно. я предполагаю, это потому, что ссылка на класс А еще не «готова» в данный момент ...? но ошибка не исчезнет, ​​если я переместу инициализацию класса B в отдельную функцию внутри A, которую я бы вызвал "извне" ...

как я могу передать эту собственную ссылку извне конструктору B?

Ответы [ 4 ]

8 голосов
/ 01 июля 2010

Будьте очень осторожны, потому что до тех пор, пока А не будет построен, он на самом деле не существует.Если бы B вызвал метод для A, программа должна была завершиться сбоем, потому что вы не можете вызвать метод для A до того, как A будет сконструирован.Построение не завершено, пока A полностью не вернется из своего кода конструктора.

Если вы должны инициализировать B с A при конструировании A, гораздо лучше создать фабричный класс для A, который гарантирует, что B инициализируется после AпостроенЭто выглядело бы примерно так

public class AFactory {

  public A newA() {
    A a = new A();
    B b = new B(a);
    return a;
  }

}

Для правильной работы на 100% вам может потребоваться ограничить видимость конструктора A ().Лично я бы поместил AFactory в тот же пакет, что и A, и сделал бы доступ «по умолчанию» или «закрытым», например,

package same.as.afactory;

public class A {
  A() {
    ...
  }
}
5 голосов
/ 01 июля 2010

Я бы спросил себя: ты уверен, что это дизайн, который ты хочешь? И, если это так, имеет ли смысл для одного из этих классов быть внутренним классом другого?

1 голос
/ 27 января 2015

Посмотрите, вот способ использования созданного собственного экземпляра в самом конструкторе:

public class Foo {
    private int x;

    public Foo() {
        this(1);
        // the self instance should have been constructed now
    }

     public Foo(int x) {
        this.x = x;
     }
}

Как мне вызвать один конструктор из другого в Java?

0 голосов
/ 01 июля 2010

Создайте объект-держатель, который вы можете передать из A в B, а затем вставьте этот экземпляр A, когда закончите конструктор A. Затем B может обратиться к this-значению внутри держателя позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...