2012-04-16 4 views
6

Przeglądam źródła Androida, po prostu czytam i natknąłem się na dziwny fragment kodu w Android.Util.JsonReader. Jest on następujący:Osobliwa Java Scope

private final List<JsonScope> stack = new ArrayList<JsonScope>(); 
{ 
    push(JsonScope.EMPTY_DOCUMENT); 
} 

Co to dokładnie robi? To znaczy, zakres bezpośrednio po przypisaniu new? Jeśli rozumiem poprawnie, za każdym razem, gdy ta klasa, JsonReader jest instancjonowana, (zamiast statycznego, prawda?), stack zostanie zainicjowany tutaj, zamiast przez this.stack = ... w konstruktorze, prawda?

Co robi zakres? Czy jest to wykonywane po zainicjowaniu stack? Jestem trochę zmieszany, jeśli chodzi o nazwę tego wzoru i jego użycie.

Odpowiedz

5

Nie jest to związane z nowym Oświadczeniem. To inicjator, coś w rodzaju nienazwanego konstruktora bez parametrów.

http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.6

Są one wykonywane przed konstruktorów klasy w kolejności tekstowej

http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5

+0

Co następnie uruchamia go? Czy ich może być wiele różnych, prawdopodobnie po różnych polach klasowych? – Josh

+0

Dzięki, to są świetne linki. Pytanie jednak, dlaczego pojawia się natychmiast po tym konkretnym polu? Czy to jest specyficzne dla tej klasy? Istnieje ~ 6 pól, które podążają za 'stack', przed konstruktorem klasy i mniej więcej tyle samo przed nim. – Josh

+2

Założę, że jest tam tylko dlatego, że manipuluje polem stosu za pomocą wywołania Push. –