Inicjowanie klas Java
Pierwsze zagadnienie, o jakim dowiedziałem się na JavaBlackBelt, mimo iż dla mnie stanowiło nowość, należy do absolutnych podstaw języka. Byłem mocno zdziwiony gdy poznałem bloki inicjujące (bo o nich mowa), zwłaszcza że nie spotkałem się z nimi nigdy wcześniej – ani na studiach, ani w Internecie.
Ale do rzeczy.
Blok inicjujący wygląda jak metoda bez typu i nazwy. Może posłużyć do zainicjowania pól klasy:
public class Foo {
private int i;
{
i = 1;
}
}
Istnieją też statyczne bloki inicjujące, rządzące się tymi samymi prawami, co statyczne metody:
public class Foo {
private static int i;
static {
i = 1;
}
}
Można powiedzieć, że blok inicjujący zachowuje się jak konstruktor bez parametrów. Jednak w rzeczywistości wywoływany jest zawsze przed dowolnym konstruktorem danej klasy (także domyślnym – jeżeli żaden nie został zdefiniowany). Zatem w bloku inicjującym można zawrzeć operacje wykonywane zawsze.
Oczywiście konstruktor klasy bazowej wciąż wywoływany jest przed blokiem inicjującym klasy bieżącej. Dla przykładu wezmę następujące klasy:
public class InitBase {
{
System.out.println("InitBase init block.");
}
public InitBase() {
System.out.println("InitBase constructor.");
}
}
public class Init extends InitBase {
{
System.out.println("Init init block.");
}
public InitBase() {
super();
System.out.println("Init constructor.");
}
}
Utworzenie nowej instancji klasy Init przyniesie następujący rezultat:
InitBase init block. InitBase constructor. Init init block. Init constructor.
Na koniec pozostawiłem jeszcze jeden ciekawy przykład wykorzystania bloków inicjujących:
public class Foo {
private List<String> list;
{
list = new ArrayList<String>() {{
add("Elements");
add("of");
add("list");
}};
}
}



