2013-02-27 43 views
5

To może być kwestia osobistego gustu i przepływu pracy, ale w przypadku, gdy jest coś więcej, uważam, że powinienem zapytać.Java: Różnica między inicjowaniem przez konstruktor i metodą statyczną?

W języku Java, jakie są różnice między tworzeniem instancji za pośrednictwem konstruktora i metodą statyczną (która zwraca instancję)? Weźmy na przykład ten fragment kodu z projektu pracuję nad (napisany przez strony w chwili nadania, więc niektóre skróty i wolności są brane):

Plugin main; 
Map<int, int> map; 

public Handler(Plugin main) { 
    this.main = main; 
} 

public static Handler init(Plugin main) { 
    Handler handler = new Handler(main); 
    handler.createMap(); 
} 

public void createMap() { 
    this.map = Maps.newHashMap(); 
} 

W przypadkach takich jak ten, co by różnica jest między używaniem

Handler handler = new Handler(this); 

i

Handler handler = Handler.init(this); 

w klasie Plugin, oprócz faktu, że createMap() działa tylko w tym drugim, ponieważ nie nazywa w konstruktorze?

Aby wyjaśnić, w tym przypadku, Plugin jest uważana za główną.

Znam wystarczająco dużo składni języka Java, aby móc pisać wtyczki pośrednie, ale nie wystarcza sama Java, aby wiedzieć, jaka jest różnica między tymi dwoma sposobami.

EDYCJA: Na przykład klasa Maps, którą użyłem do utworzenia Map używa statycznej metody fabrycznej (mam nadzieję, że używam tego terminu poprawnie) wywołanego przy użyciu klasy zamiast obiektu.

+5

brakowało kodu? – user1428716

+0

Przepraszam; TAK PRZEDSTAWIONY, zanim skończyłem pisać! Musiałem trafić przypadkowo w Tab i nie zdawałem sobie z tego sprawy, dopóki nie spróbowałem nacisnąć Enter, aby wstawić znak nowej linii. Ale cieszę się, że ludzie byli w stanie przeczytać i odpowiedzieć na to, zanim mogłem zakończyć pisanie, chociaż informacje podane w tym czasie były prawie zerowe B-) – ChaoticWeg

+1

"napisane ręcznie w momencie księgowania" - zawsze możesz testuj próbki kodu w [ideone] (http://ideone.com/) (Edytor podświetlania składni dla nich nie byłby zły, gdyby je tworzył, gdyby nie wymagał wcięć z kartami.) – millimoose

Odpowiedz

6

Różnica polega na tym, że statyczna metoda fabryczna jest bardziej elastyczna. Może mieć wiele sposobów na zwrócenie instancji. Może robić inne rzeczy po stronie. Może mieć bardziej opisową nazwę. Może być wywołana przez jego prostą nazwę (np. foo(args)) przez import statyczny lub dziedziczenie.

Wywołanie konstruktora jest bardziej pewne - osoba dzwoniąca dokładnie wie, co się dzieje - tworzone jest nowe wystąpienie tej klasy.

+0

+1. Dodam, że statyczna metoda fabularna ma opcję zwrócenia instancji innej klasy betonu, co może być bardzo przydatne w pewnych okolicznościach. – mikera

+0

Zaakceptowany. To jest rodzaj odpowiedzi, której szukam. Odpowiedź Nishanta jest rzeczywiście pomocna i pouczająca, ale szukam raczej różnic, niż zalet/wad. Tak czy inaczej, oba są pomocne. :) Dzięki! – ChaoticWeg

7

Istnieją zarówno zalety, jak i wady statycznych metod fabrycznych.

Zalety

  • opisowy, znaczących nazwisk.
  • Wywołany mogą decydować, czy należy zwrócić nową instancję
  • Mogą zwrócić Przedmiot według dowolnego podtypu typu powrotnej
  • zmniejszają one szczegółowość tworzenia przypadków typ parametrami

Wady

  • Jeśli udostępniasz tylko statyczne metody fabryk, nie można klasyfikować klas bez publicznych lub chronionych konstrukcji
  • Nie są one łatwe do odróżnienia od innych metod statycznych

Źródło: Efektywna Java, II wyd.

+6

Zaleta nr 4 już nie ma w java 7, która wprowadziła wniosek o diament, aby rozwiązać ten problem. – irreputable