在调用 super() 之前声明变量,但 super 必须是第一个语句

Declaring variables before call to super() but super must be the first statement

我有一个抽象的构造函数class,它的构造函数中有很多参数

我正在尝试扩展这个 class 并且我想在扩展构造函数中调用 super() 时设置一些默认值。

问题是通过查看代码看起来很乱:

super(0,1,2,3,4,5,6,7,8,9);

(请记住,这已针对堆栈溢出进行了简化)。

我想要做的是拥有这样的构造函数:

    public Test(){
    int a = 0;
    int b = 1;
    int c = 2;
    int d = 3;
    int e = 4;
    int f = 5;
    int g = 6;
    int h = 7;
    int i = 8;
    int j = 9;
    super(a,b,c,d,e,f,g,h,i,j);
}

纯粹是为了视觉和阅读方便。有什么办法吗?

不,没有。对 super 的调用必须是构造函数的第一行。 不过,您可以将这些默认值定义为 class 的静态最终成员。

static final int a = 0;
static final int b = 1;
static final int c = 2;
static final int d = 3;
static final int e = 4;
static final int f = 5;
static final int g = 6;
static final int h = 7;
static final int i = 8;
static final int j = 9;

public Test()
{
    super(a,b,c,d,e,f,g,h,i,j);
}

您可以将变量移到构造函数之外

public class Test extends YourFancySuperclassWithToManyParametersInConstructor {
    int a = 0;
    int b = 0; 
    ...
    public Test() {
          super(a,b,...);
    }
}

不,你不能这样做 - 但如果重要的部分是给参数赋予有意义的名称,你可以考虑这样的事情:

class Foo extends Bar {
    private static final int DEFAULT_WIDTH = 10;
    private static final int DEFAULT_HEIGHT = 10;

    public Foo() {
        super(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }
}

就个人而言,我发现这比在构造函数中使用局部变量更容易理解。

另一个解释选项是评论:

public Foo() {
    super(
        10,  // width
        10); // height
}

无论如何,这只会是 与您的 "declare separate variables" 代码相同的数量。

声明常量的 Java 约定是使用 'final static' 变量,所以我想你可以这样做:

public class Y extends X {
    private static final int p1 = 1;
    private static final int p2 = 1;
    private static final int p3 = 1;

    public Y() {
        super(p1, p2, p3);
    }
}

我认为有更好的方法来设置 super class' 值,但是如果您需要在调用 super 之前计算变量,我知道的唯一方法是在静态方法中进行计算并编写调用super 调用的参数列表中的那些方法。
例如:

 class MySuper {
    int i1;
    int i2;
    int i3;
    public MySuper(int i, int ii, int iii){
        i1 = i;
        i2 = ii;
        i3 = iii;
    }
}

class MyClass extends MySuper {
    public MyClass() {
        super(calc1(), calc2(), calc3());
    }

    private static int calc1() {
        return 1;
    }
    private static int calc2() {
        return 2;
    }
    private static int calc3() {
        return 3;
    }
}

但是如果你只需要常量,比其他答案更好。