/ / Niestatyczne bloki inicjalizujące - czy mam nieco większą kontrolę? - java

Nie-statyczne bloki inicjalizacyjne - czy mam nieco większą kontrolę? - java

Nadal jestem na krzywej uczenia się w Javie. Aby zrozumieć nieco więcej bloków inicjalizacyjnych, stworzyłem małą klasę testową:

public class Script {

{
Gadgets.log("anonymous 1");
}

public Script() {
Gadgets.log("constructor");
}

{
Gadgets.log("anonymous 2");
}
}

Kiedy tworzę instancję, otrzymuję ten dziennik:

Script: anonymous 1
Script: anonymous 2
Script: constructor

To mówi mi, że oba bloki inicjalizujące działają PRZEDkonstruktor, w kolejności, w jakiej występują w kodzie źródłowym (tak samo jak statyczne inicjatory). Chcę wiedzieć: czy mam nieco większą kontrolę nad tym zachowaniem? Ponieważ Dokumentacja Java mówi (źródło):

Bloki inicjalizujące na przykład zmienne wyglądają jak statyczne bloki inicjalizujące, ale bez statycznego słowa kluczowego:

{
// whatever code is needed for initialization goes here
}

Kompilator Java kopiuje bloki inicjalizujące do każdego konstruktora. W związku z tym, to podejście można wykorzystać do współdzielenia bloku kodu między wieloma konstruktory.

Co dokładnie oznacza „kopiowanie bloków inicjalizujących do każdego konstruktora”? Według mojego dziennika wydaje się, że są one kopiowane na początku każdego konstruktora. Czy to jest poprawne?

Udostępnianie takich bloków między wieloma konstruktoramibyłoby również całkowicie sensowne, gdyby zostały skopiowane do END każdego konstruktora (tego oczekiwałem w mojej anonimowej 2). Czy istnieje sposób na bardziej kontrolowanie tych bloków, czy też moja jedyna opcja to „klasyczny” sposób pisania nazwanej metody, która jest wywoływana w każdym konstruktorze, jeśli chcę wykonywać typowe zadania na koniec każdego konstruktora?

Odpowiedzi:

11 dla odpowiedzi nr 1

Konstruktor wykonuje się w następującej kolejności:

  1. super() zadzwoń, domyślnie lub wyraźnie.
  2. Inicjatory zmiennych i bloki inicjalizujące, w kolejności, w jakiej występują w kodzie źródłowym.
  3. Resztka konstruktora.

Jest to określone w JLS i nie można tego zmienić.

Jeśli this() wywołanie jest obecne, zastępuje (1) i (2).