如何从Random
拨打java.util.Random
到supertype constructor
?
例如
Random rand = new Random();
int randomValue = rand.nextInt(10) + 5;
public Something()
{
super(randomValue);
//Other Things
}
当我尝试这个时,编译器说我“在调用randomValue
之前”无法引用supertype constructor
。
答案 0 :(得分:14)
super()
调用必须是构造函数中的第一个调用,并且只有在超级调用返回后才会计算初始化实例变量的任何表达式。因此super(randomValue)
尝试将尚未声明的变量的值传递给超类的构造函数。
一种可能的解决方案是使rand
为静态(对于所有类的实例都有一个随机数生成器)并在构造函数中生成随机数:
static Random rand = new Random();
public Something()
{
super(rand.nextInt(10) + 5);
//Over Things
}
答案 1 :(得分:7)
另一种可能的解决方案是添加构造函数参数并使用工厂方法;
public class Something extends SomethingElse {
private Something(int arg) {
super(arg);
}
public static Something getSomething() {
return new Something(new Random().nextInt(10) + 5);
}
}
答案 2 :(得分:0)
这不是最优雅的解决方案,但另一种解决方案是拥有2个构造函数而没有字段。
public class Something extends SomethingElse{
public Something(){
this(new Random());
}
private Something(Random rand){
super(rand.nextInt(10) + 5);
//Other Things
}
}