如何在Java中实现构造函数包装?

时间:2010-10-07 12:29:04

标签: java constructor

这就是我想要做的(在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 个答案:

答案 0 :(得分:18)

你可以像这样实现它:

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参数处于最终状态。这可能是有问题的。)

最后,我同意静态工厂方法是这种方法的一个很好的替代方法。

答案 1 :(得分:5)

您可以将“默认构造函数”实现为静态工厂方法:

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

答案 2 :(得分:-1)

就像它说的那样,对this()的调用必须是构造函数中首先发生的事情。有什么理由不行吗?

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