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

时间:2015-02-03 13:21:15

标签: java constructor

我在抽象类中有一个构造函数,它在其构造函数

中包含许多参数

我正在尝试扩展这个类,我想在扩展构造函数的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);
}

纯粹用于视觉和易于阅读的目的。有没有办法做到这一点?

5 个答案:

答案 0 :(得分:4)

不,你不能这样做 - 但如果重要的部分是给论证有意义的名字,你可以考虑这样的事情:

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
}

这只是与“声明单独的变量”代码相同的的数量。

答案 1 :(得分:2)

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

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);
}

答案 2 :(得分:0)

您可以在构造函数之外移动变量

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

答案 3 :(得分:0)

声明常量的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);
    }
}

答案 4 :(得分:0)

我认为有更好的方法来设置超类的值,但如果你需要在调用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;
    }
}

但如果你只需要常数,那么其他答案就更好了。