Использование рандомов и супер
Как я могу назвать 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
}
}