Использование рандомов и супер

Как я могу назвать 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 был вызван".

Ответы

Ответ 1

Вызов super() должен быть первым вызовом в конструкторе, и любые выражения, инициализирующие переменные экземпляра, будут оцениваться только после возврата супервызова. Поэтому super(randomValue) пытается передать значение переменной, еще не объявленной конструктору суперкласса.

Возможное решение состоит в том, чтобы сделать rand static (имеет смысл иметь один генератор случайных чисел для всех экземпляров вашего класса) и генерировать случайное число в конструкторе:

static Random rand = new Random();

public Something() 
{
    super(rand.nextInt(10) + 5);
    //Over Things
}

Ответ 2

Другим возможным решением является добавление параметра конструктора и метод factory;

public class Something extends SomethingElse {
    private Something(int arg) {
        super(arg);
    }

    public static Something getSomething() {
        return new Something(new Random().nextInt(10) + 5);
    }
}

Ответ 3

это не самое элегантное решение, но другое решение будет состоять из 2 конструкторов и никакого поля.

public class Something extends SomethingElse{
    public Something(){
        this(new Random());
    }

    private Something(Random rand){
        super(rand.nextInt(10) + 5);
        //Other Things
    }
}