wtorek, listopada 17, 2009

Giń konstruktorze! Giń! ;-)

Kartkuję sobie Effective Java i już pierwsza rada mi się spodobała :-) jest to rada "Rozważ użycie statycznej metody fabrykującej zamiast konstruktora".

To zdecydowanie ułatwia późniejszy refactoring, oraz poprawia naszą zdolność do samodzielnego zarządzania obiektami.

Jeżeli np. stworzenie obiektu jest kosztowne, a można go używać wielokrotnie to dzięki zastąpieniu konstruktora metodą fabrykującą będziemy w stanie utrzymywać np. pulę z obiektami i serwować je o wiele szybciej.
Także gdy nam obije i zapragniemy używać Singletona, albo np. jednej kopi obiektu na wątek [czasem się przydaje] to skorzystanie z metody fabrykującej zamiast konstruktora na pewno pomoże.

Innym aspektem jest łatwiejsza - czytaj wymagająca mniejszej ilości kodu - parametryzacja typu przy pomocy generyków [się rymło ;-)]

Np. teraz by stworzyć List<String> z ArrayList musimy zrobić to tak:
List<String> list = new ArrayList<String>();

Ale gdyby w klasie ArrayList zamiast konstruktora bezparametrowego była metoda:
 public static <E> List<E> createList() {
return new ArrayList<E>();
}

Wtedy moglibyśmy kod taki:

List<String> strings = new ArrayList<String>();
List<Integer> integers = new ArrayList<Integer>();

zastąpić takim:

List<String> strings = ArrayList.createList();
List<Integer> integers = ArrayList.createList();

A ten drugi jest zdecydowanie ładniejszy ;-)

Ogólnie takie podejście ułatwia późniejszą pracę z kodem, bo gdy zmienia nam się koncepcja to dzięki takiemu podejściu mamy większą kontrolę nad tym co się dzieje.
Możemy nawet zacząć serwować obiekty innego typu niż nasz jeśli akurat taki mamy kaprsy ;-) [byle ten nowo serwowany typ obiektów był zgodny z starym typem ;-)].

OK, są dwie wady takiego rozwiązania. Wada pierwsza to niemożność dziedziczenia po takiej klasie [da się to obejść, ale przy dzisiejszym przekonaniu, że dziedziczenie jest złe i kłopotliwe może i nie warto ;-)]
Druga wada jest bardziej subtelna i wynika z faktu, że nie ma sposobu na odróżnienie takiego metody fabrykującej od innych metod statycznych, ale to można załatwić nazwą.


Podobne postybeta
Konstruktory
Trick w Java'ie ;-) czyli double brace initialization
Ile to jest 1+1 w Java'ie?
Niecne wykorzystanie refleksji... czyli jak poszukać tekstu w drzewie obiektów? ;-)
Lenistwo w działaniu, "piklujemy" Androida ;-)