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?

questionAnswers(19)

yourAnswerToTheQuestion