3

我有一个包含最终 int valA 的类 A。

我有一个子类 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();
    }
}
4

2 回答 2

3

超级构造函数调用必须是构造函数中的第一条语句。因此,B应该如下所示:

static class B extends A{
    final int valB;
    B(int valB) {
        super(valB+1);
        this.valB = valB;
    }
}

此外,您不能从超级构造函数调用中对实例方法进行任何引用。您可以创建initC()一个static方法,但这会破坏其目的,因为您不能再从内部分配实例变量initC()

鉴于更新的问题...

您无法解决这个初始化问题,这实际上是一个设计问题。我建议您将超大对象的构造提取到外部“工厂”,并降低A' 和B' 初始化的复杂性,使构造函数尽可能苗条。

于 2012-12-29T21:17:27.847 回答
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();
    }
}
于 2012-12-29T22:03:52.217 回答