这就是我想要做的(在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
有解决方法吗?
答案 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) {
// ...
}
}