Dlaczego to () i super () muszą być pierwszą instrukcją w konstruktorze?
Java wymaga, aby w przypadku wywołania this () lub super () w konstruktorze była to pierwsza instrukcja. Czemu?
Na przykład:
public class MyClass {
public MyClass(int x) {}
}
public class MySubClass extends MyClass {
public MySubClass(int a, int b) {
int c = a + b;
super(c); // COMPILE ERROR
}
}
Kompilator Sun mówi, że „wywołanie super musi być pierwszą instrukcją konstruktora”. Kompilator Eclipse mówi „Wywołanie konstruktora musi być pierwszą instrukcją w konstruktorze”.
Można jednak obejść to, zmieniając nieco kod:
public class MySubClass extends MyClass {
public MySubClass(int a, int b) {
super(a + b); // OK
}
}
Oto kolejny przykład:
public class MyClass {
public MyClass(List list) {}
}
public class MySubClassA extends MyClass {
public MySubClassA(Object item) {
// Create a list that contains the item, and pass the list to super
List list = new ArrayList();
list.add(item);
super(list); // COMPILE ERROR
}
}
public class MySubClassB extends MyClass {
public MySubClassB(Object item) {
// Create a list that contains the item, and pass the list to super
super(Arrays.asList(new Object[] { item })); // OK
}
}
Tak jestnie powstrzymuje cię przed wykonaniem logiki przed wezwaniem do super. To po prostu powstrzymuje cię przed wykonaniem logiki, której nie możesz zmieścić w jednym wyrażeniu.
Istnieją podobne zasady dzwonieniathis()
. Kompilator mówi, że „wywołanie tego musi być pierwszą instrukcją konstruktora”.
Dlaczego kompilator ma te ograniczenia? Czy możesz podać przykład kodu, w którym, jeśli kompilator nie miałby tego ograniczenia, wydarzyłoby się coś złego?