Myślałem, że zmienne statyczne, finalne są inicjalizowane zawsze jako pierwsze i taka operacja jest nie możliwa.
Pola statyczne i bloki oznaczone słówkiem static
są inicjowane/ wykonywane przy ładowaniu klasy. Ładowanie klas w Javie jest leniwe - JVMka ładuje klasę dopiero, gdy jest potrzebna, czyli w momencie pierwszego użycia. Stąd kod podany przez ciebie może spokojnie działać.
Ładowanie klasy i tworzenie instancji obiektu danej klasy to dwie różne rzeczy. Żeby stworzyć instancję obiektu klasa musi być załadowana, ale do ładowania klasy nie trzeba tworzenia instancji obiektu - wystarczy odwołać się do statycznych pól i metod, czy też np do klasy bezpośrednio, w sensie np Klasa.class.toString()
.
Z powyższego wynika, iż podany przez ciebie kod może spokojnie działać, ale właśnie pod warunkiem, że pole properties
zostanie zainicjalizowane właściwym obiektem zanim klasa Klasowa
zacznie być ładowana.
To czy pole jest finalne nie ma znaczenia przy kolejności inicjalizacji.