在调用 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;
}
}
但是如果你只需要常量,比其他答案更好。
我有一个抽象的构造函数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;
}
}
但是如果你只需要常量,比其他答案更好。