Listopad
22
2009

Inicjowanie klas Java

Słowa kluczowe: , | Kategorie: Java
No Gravatar

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");
        }};
    }
}

Napisz Komentarz

*