Czy w Javie jest jakiś sposób na zainicjowanie pola przed uruchomieniem super-konstruktora?Inicjalizuj pole przed uruchomieniem super-konstruktora?
Nawet najbrzydszy hacki mogę wymyślić są odrzucane przez kompilator:
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;
}
}
Uwaga: Problem zniknął, kiedy przełącza się z delegacją do dziedziczenia, ale nadal chciałbym wiedzieć.
Czy próbujesz wstępnie zainicjalizować pole 'a'? – Woot4Moo
Nie sądzę, że możesz to zrobić. Każda inicjalizacja wykonywana w klasie (nawet jeśli znajduje się poza konstruktorem) jest przenoszona do każdego konstruktora po wywołaniu 'super'. Tak więc super konstruktor jest zawsze uruchamiany przed inicjalizacją pola. –
@FredOverflow, ponieważ 'a' jest dostępny tylko w' Derived', dlaczego ma znaczenie, że zostanie zainicjowany * przed wywołaniem * 'super()'? Inicjowanie go zaraz po wykonaniu nie ma wpływu na przykład dostarczany przez ciebie (chyba że wywołasz nadpisaną metodę z konstruktora Base, który zaczyna pachnieć dość podejrzanie). – assylias