使用randoms和super

时间:2015-06-28 09:18:02

标签: java random compilation super

如何从Random拨打java.util.Randomsupertype constructor

例如

Random rand = new Random();
int randomValue = rand.nextInt(10) + 5;

public Something() 
{
    super(randomValue);
    //Other Things
}

当我尝试这个时,编译器说我“在调用randomValue之前”无法引用supertype constructor

3 个答案:

答案 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
    }
}