Любой способ в инициализации объектов в конструкторе, который нуждается в этом в качестве параметра? - PullRequest
0 голосов
/ 09 ноября 2010

Я столкнулся с проблемой в Java, но я думаю, что это вопрос об ООП в целом. Это должно быть довольно распространенной потребностью, поэтому я надеюсь, что есть решение, о котором я просто не знаю.

Что вы делаете, когда вам нужно инициализировать поля объекта в конструкторе, но эти объекты нуждаются в этом в качестве параметра?

Так вот, что вы не можете сделать:

public class SomeClass {
    private SomeOtherClass foo;
    public SomeClass (SomeOtherClass foo) {
         this.foo = foo;
    }
}

public class SomeOtherClass {
     private SomeClass bar;
     public SomeOtherClass() {
          bar = new SomeClass(this);
     }
}

Я не знаю ни о каком решении, кроме наличия метода init (), который выполняет всю инициализацию объекта, и вызова его после инициализации объекта SomeOtherClass в моей основной программе. Есть ли способ лучше? Или есть способ заставить метод SomeOtherClass (метод init ()) запускаться после завершения конструктора, не вызывая его явно?

Спасибо!

Ответы [ 2 ]

1 голос
/ 09 ноября 2010

Вы можете делать то, что вы показали. Как вы думаете, почему это не сработает?

Единственное ограничение - это передача this конструктору суперкласса (что является гораздо более редким искушением). Например, вы не можете сделать это:

public class SomeSubclass extends SomeSuperclass {
  public SomeSubclass() {
    super(this); /* ERROR: Can't pass `this` to super-ctor. */
  }
}
0 голосов
/ 09 ноября 2010

Я всегда использовал методы initialize () для этого. Я предполагаю, что вы могли бы создать поток, который запускается после создания объекта, но это ужасная идея. Что касается выполнения в конструкторе, как вы изначально спросили, я не понимаю, как это будет работать.

Чтобы использовать автомобильную аналогию, вы находитесь в процессе создания автомобиля (SomeOtherClass), но не уверены в его состоянии завершения. Вы хотите, чтобы автомобиль ехал по дороге (SomeClass), но для использования этой дороги вам нужна полная машина. Делать то, что вы говорите, было бы все равно, что проехать по дороге двигатель и ожидать, что все сработает. Это просто не имеет смысла в терминах ООП.

TL; DR: используйте метод init (), как вы предложили, и вызывайте его день.

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