niedziela, stycznia 08, 2012

Trick w Java'ie ;-) czyli double brace initialization

Na HackeNews pojawił się "news" o ukrytych ficzerach Java'y, który prowadzi do StackOverflow (http://stackoverflow.com/questions/15496/hidden-features-of-java).
Najbardziej mi się poodoba Double Brace Initialization ;-)
Najpierw nie rozumiałem o co chodzi, ale jak spojrzałem dokładniej na kod to jest to banalnie proste i genialne ;-)
Np. gdy chcemy stworzyć statyczną listę z 2 wartościami, to zwykle robi się to tak (pomińmy to co trzeba zrobić w większości przypadków czyli użycie niemodyfikowalnej listy):

public final static List<String> YES_NO = new ArrayList<String>();
static {
YES_NO.add("Yes");
YES_NO.add("No");
}


Z użyciem double brace initlialization będzie:

public final static List<String> YES_NO = new ArrayList<String>() {{
add("Yes");
add("No");
}}

;-)
A co robi ten kod? ;-)
Po prostu deklarujemy tam klasę anonimową i dodajemy jej sekcję, która będzie wywoływana w trakcie konstrukcji instancji :-) [jeszcze przed konstruktorem domyślnym :-)]
Człowieka gdy na to patrzy czaruje to {{ i }}, ale tak naprawdę ten kod można zobaczyć tak:

public final static List<String> YES_NO = new ArrayList<String>() {
{
add("Yes");
add("No");
}
}

I wtedy nagle staje się czytelniejszy :-)

Chytre to :-)



Podobne postybeta
Giń konstruktorze! Giń! ;-)
Niecne wykorzystanie refleksji... czyli jak poszukać tekstu w drzewie obiektów? ;-)
Klasa statyczna - ki diabeł?;-)
AST w akcji - zamieniamy źrodło w Java'ie w "rysunek" ;-)
Lubię enumy