如何在Java中实现构造函数包装?
问题描述:
这就是我想要做的(在Java中1.6):如何在Java中实现构造函数包装?
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
有什么解决方法吗?
答
你需要实现这样的:
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
说法是最终状态,这可能是有问题。)
最后,我同意,一个静态工厂方法这是一种很好的替代方法。
答
可以实施“默认构造函数”作为一个静态工厂方法:
public class Foo {
public static Foo createFooWithDefaultBar() {
Bar b = new Bar();
b.setSomeData();
b.doSomethingElse();
return new Foo(b);
}
public Foo(Bar b) {
// ...
}
}
答
像它说,这个()的调用必须在构造函数来发生的第一件事情。这有什么理由不起作用吗?
public class Foo {
public Foo() {
this(new Bar());
Bar b = getBar();
b.setSomeData();
b.doSomethingElse();
}
public Foo(Bar b) {
// ...
}
}
这是否真的回答第二个构造函数上的邮件? – RonU 2010-10-07 12:47:47
*回复邮件* ??? – 2010-10-07 12:51:59
@RonU - 国际海事组织,我的回答直接解决了OP的问题。如果您不同意,请解释原因。 – 2010-10-07 13:18:11