Как реализовать перенос конструктора в Java? - PullRequest
6 голосов
/ 07 октября 2010

Это то, что я пытаюсь сделать (в Java 1.6):

public class Foo {
  public Foo() {
    Bar b = new Bar();
    b.setSomeData();
    b.doSomethingElse();
    this(b);
  }
  public Foo(Bar b) {
    // ...
  }
}

Компилятор говорит:

call to this must be first statement in constructor

Есть ли обходной путь?

Ответы [ 3 ]

18 голосов
/ 07 октября 2010

Вы можете реализовать его следующим образом:

public class Foo {
  public Foo() {
    this(makeBar());
  }
  public Foo(Bar b) {
    // ...
  }
  private static Bar makeBar() {
    Bar b = new Bar();
    b.setSomeData();
    b.doSomethingElse();
    return b;
  }
}

Метод makeBar должен быть статическим, поскольку объект, соответствующий this, недоступен в точке, где вы вызываете метод.

Кстати, этот подход имеет то преимущество, что передает полностью инициализированный Bar объект Foo(Bar).(@RonU отмечает, что его подход этого не делает. Это, конечно, означает, что его конструктор Foo(Bar) не может предположить, что его аргумент Foo находится в своем конечном состоянии. Это может быть проблематично.)

Наконец, я согласенчто метод статической фабрики является хорошей альтернативой этому подходу.

5 голосов
/ 07 октября 2010

Вы можете реализовать «конструктор по умолчанию» как статический фабричный метод:

public class Foo {
  public static Foo createFooWithDefaultBar() {
    Bar b = new Bar();
    b.setSomeData();
    b.doSomethingElse();
    return new Foo(b);
  }
  public Foo(Bar b) {
    // ...
  }
}
0 голосов
/ 07 октября 2010

Как говорится, вызов this () должен быть первым, что происходит в конструкторе Есть ли причина, по которой это не сработает?

public class Foo {
  public Foo() {
    this(new Bar());
    Bar b = getBar();
    b.setSomeData();
    b.doSomethingElse();
  }
  public Foo(Bar b) {
    // ...
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...