我有一个A类,它包含一个最终的int,valA。
我有一个子类B,它包含一个大的最终对象objB。
valA的值取决于使用B的构造函数传递的objB。
如何创建B的实例?
我已经为我正在尝试的内容添加了最少的代码。
public class Test {
public static void main(String[] args){
System.out.println(new B(3).valA);
}
static class A{
final int valA;
A(int valA) {
this.valA = valA;
}
}
static class B extends A{
final Object objB;
B(int initVal) {
this.objB = someMethod(initVal);
super(objB.hashCode()+1);
}
}
Object someMethod(int initVal){
// pretend there's some super complicated logic that returns a large object
return new Object();
}
}
答案 0 :(得分:3)
超级构造函数调用必须是构造函数中的第一个语句。因此,B
应如下所示:
static class B extends A{
final int valB;
B(int valB) {
super(valB+1);
this.valB = valB;
}
}
此外,您不能从超级构造函数调用中对实例方法进行任何引用。您可以使initC()
成为static
方法,但这样做会失败,因为您无法再从initC()
您无法解决此初始化问题,这实际上是一个设计问题。我建议你将你的大对象的构造提取到一个外部的“工厂”,并降低A
和B
初始化的复杂性,使构造者尽可能地保持苗条。
答案 1 :(得分:2)
您可以在B中使用重载的构造函数。在下面的代码中,someMethod已经变为静态,或者它可能是B中的最终成员方法。
public class Test {
public static void main(String[] args){
System.out.println(new B(3).valA);
}
static class A{
final int valA;
A(int valA) {
this.valA = valA;
}
}
static class B extends A{
final Object objB;
B(int initVal) {
this(someMethod(initVal));
}
private B(Object objB) {
super(objB.hashCode()+1);
this.objB = objB;
}
}
static Object someMethod(int initVal){
// pretend there's some super complicated logic that returns a large object
return new Object();
}
}