Zvaž statickou tovární metodu

Standardní cestou, jak v Javě získat nový objekt, je přímé zavolání konstruktoru. Není to však možnost jediná, někdy může být výhodnější použít tzv. statickou tovární metodu (v orignále static factory method). Jaké jsou tedy výhody ve srovnání s přímým voláním konstruktoru?

Statické tovární metody ..
  • mají jméno. Vhodně zvolené jméno může přispět k větší čitelnosti kódu (např. ze standardní knihovny BigInteger(int, int, Random) vs. BigInteger.probablePrimer(int, Random)). Další výhodou jména je, že na rozdíl od konstruktoru nejsme při vyšším počtu metod omezeni v deklaraci parametrů z důvodu jejich stejného počtu a typu.
  • nemusí vždy vytvářet nové instance. Třídy tak mohou mít kontrolu nad počtem vytvořených instancí (např. singletony) a mohou vracet již předpřipravené či cachované objekty (např. Boolean.valueOf(boolean)) nebo i null.
  • mohou vracet objekt podtypu. API tak může vracet objekty, aniž by jejich třídy byly veřejné (např. java.util.Collections). Navrácené objekty se také mohou lišit v závislosti na různých podmínkách (předaných parametrech, vývojem v čase, ..). Příkladem jsou dvě různé implementace abstraktní třídy java.util.EnumSet, které jsou voleny dle počtu prvků v množině.
Jsou zde i nevýhody, které je třeba mít na paměti.
  • Z třídy bez public či protected konstruktoru nelze dědit. To samé platí i pro neveřejné třídy vrácené veřejnými statickými továrními metodami.
  • Na první pohled nejsou poznat od normálních statických metod, což může být pro uživatele matoucí. Doporučuje se alespoň používat běžná jména (valueOf, of, getInstance newInstance, ..).

Statické tovární metody i konstruktory mají své výhody a případy užití. Je tedy dobré vždy zvážit, co je pro nás v dané situaci výhodnější.

Zdroj: Joshua Bloch - Effective Java (2nd edition), k dispozici i online

Článek obsahuje 0 komentářů