В Java есть ли способ инициализировать поле до запуска суперконструктора?Инициализировать поле до запуска суперконструктора?
Даже уродливые хаки я могу придумать отвергается компилятором:
class Base
{
Base(String someParameter)
{
System.out.println(this);
}
}
class Derived extends Base
{
private final int a;
Derived(String someParameter)
{
super(hack(someParameter, a = getValueFromDataBase()));
}
private static String hack(String returnValue, int ignored)
{
return returnValue;
}
public String toString()
{
return "a has value " + a;
}
}
Примечание: Проблема исчезла, когда я перешел от наследования делегирования, но я все же хотел бы знать.
Вы пытаетесь предварительно инициализировать поле 'a'? – Woot4Moo
Я не думаю, что вы можете это сделать. Любая инициализация, выполняемая вами в классе (даже если она находится вне конструктора), перемещается в каждый конструктор после вызова 'super'. Таким образом, супер-конструктор всегда запускается до инициализации поля. –
@FredOverflow с 'a' доступен только в' Derived', почему имеет значение, что он инициализируется * до того, как вызывается '' super() '? Инициализация его сразу же после того, как не имеет значения в примере вашего обеспечения (если вы не вызываете метод overriden из базового конструктора, который начинает пахнуть довольно подозрительно). – assylias