Java:在super之前在子类中分配final变量

时间:2012-12-29 21:14:01

标签: java

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

2 个答案:

答案 0 :(得分:3)

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

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

此外,您不能从超级构造函数调用中对实例方法进行任何引用。您可以使initC()成为static方法,但这样做会失败,因为您无法再从initC()

中分配实例变量

鉴于更新的问题......

您无法解决此初始化问题,这实际上是一个设计问题。我建议你将你的大对象的构造提取到一个外部的“工厂”,并降低AB初始化的复杂性,使构造者尽可能地保持苗条。

答案 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();
    }
}