Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Zelenacuv kamos 15. 04. 2016, 22:03:41

Název: Java - kdy používat statické metody/atributy
Přispěvatel: Zelenacuv kamos 15. 04. 2016, 22:03:41
Dotaz zní: kdy používat statické třídy/metody/atributy tak, aby se z toho Javistovi nenaježily vlasy hrůzou? Je problém mít třídu, ve které je metoda main, celou statickou? Tzn.: privátní statické atributy (ne nutně final) a privátní statické metody. Prostě taková inicializační třída. Půjdu ještě dál: dal bych celou třídu jako abstract. Jen tak, nikdy se nebude vytvářet její instance, tak proč ji nemít abstract. Je to ok?

Dále. Mám nějakou kořenovou abstraktní třídu. je problém si do ní dát pár statických metod jako utilitky, které nějak souvisí s děděnými třídami? Třeba budu chtít generovat speciální posloupnost číslic, dám to do této abstraktní třídy jako statickou public metodu. Prvotně je to "utilitka" pro potomky, ale třeba ji bude chtít použít i nějaká jiná třída, tak proč ji nemít static public. Je to velký problém? Jasně, mělo by se to dát zvlášť do nějakých Utils. Ale co když potřebuju jen 2 takové metody, vytvářet kvůli tomu zbytečně další třídu nějakých konkrétních Utils pro konkrétní sadu tříd? Ve které pak budou jen 1 nebo 2 metody?

Díky
Název: Re:Java - kdy používat statické metody/atributy
Přispěvatel: Kit 15. 04. 2016, 22:42:56
Typickou statickou třídou je například Math. Je to jen obálka nad statickými metodami. Nedrží žádný stav, pouze poskytuje funkcionalitu svých metod. Pokud máš metody, které se chovají podobným způsobem, klidně si je dej do statické třídy. Statické třídy mají jednu obrovskou nevýhodu: Špatně se mockují a proto se jen obtížně píší jednotkové testy.

Statické metody mají význam ve speciálních případech, například při vytváření instancí (vzor Simple Factory apod.) Nemají přístup k atribtům objektu a proto mají jen omezené možnosti. Typickou statickou metodou je main().

Statické atributy jsou ve své podstatě globální proměnné s platností uvnitř třídy. Opět mají jen omezené použití, protože všechny objekty statické atributy sdílejí. Typickým použitím jsou například konstanty.

Dále: Nevidím důvod, proč by metoda v abstraktní třídě měla být statická a ještě k tomu public. Udělej si je normálně privátní, aby byly správně zapouzdřeny. Přece nechceš psát strukturované programy v objektovém jazyce, že ne?
Název: Re:Java - kdy používat statické metody/atributy
Přispěvatel: Filip Jirsák 16. 04. 2016, 09:32:13
Je problém mít třídu, ve které je metoda main, celou statickou? Tzn.: privátní statické atributy (ne nutně final) a privátní statické metody.
V případě prototypu to problém není. V případě ostrého kódu už ano, protože tu třídu už nedokážete použít jiným způsobem (oddědit, použít části kódu jinde, otestovat). Privátní statické mutable atributy znamenají, že v té třídě držíte stav, udělal jste z ní jedináčka, a nedokážete zařídit, abyste měl několik instancí té třídy s různým stavem v jedné aplikaci.

Půjdu ještě dál: dal bych celou třídu jako abstract. Jen tak, nikdy se nebude vytvářet její instance, tak proč ji nemít abstract. Je to ok?
Není. Abstract znamená, že ta třída bude mít potomky, které upřesňují nějaké chování. Tedy přesný opak toho, co chcete udělat. Pokud se nemají vytvářet instance třídy, použijte privátní konstruktor.

Mám nějakou kořenovou abstraktní třídu. je problém si do ní dát pár statických metod jako utilitky, které nějak souvisí s děděnými třídami?
Problém to není, ale je to něco jiného, než popisujete dále. Pokud jsou to nestavové metody, pak je to správně.

Třeba budu chtít generovat speciální posloupnost číslic, dám to do této abstraktní třídy jako statickou public metodu.
Tohle už správně není, protože pro generování té posloupnosti číslic potřebujete držet stav. A co když těch posloupností budete chtít generovat víc? Nebo to generování budete chtít parametrizovat?

Prvotně je to "utilitka" pro potomky, ale třeba ji bude chtít použít i nějaká jiná třída, tak proč ji nemít static public. Je to velký problém? Jasně, mělo by se to dát zvlášť do nějakých Utils.
Pokud ji bude chtít použít i jiná třída, nebude chtít ta třída záviset na jiné třídě, která dělá úplně něco jiného, a jen tak mimochodem exportuje nějakou užitečnou metodu.


Ale co když potřebuju jen 2 takové metody, vytvářet kvůli tomu zbytečně další třídu nějakých konkrétních Utils pro konkrétní sadu tříd? Ve které pak budou jen 1 nebo 2 metody?
Co znamená „vytvářet zbytečně třídu“? Vy ty třídy kupujete na kusy? Nebo musíte o vytvoření třídy požádat nadřízeného? Vytvoření třídy je triviální věc, třídy se nevytvářejí podle toho, jestli máte pocit, že máte málo nebo hodně tříd, ale tak, abyste měl u sebe kód, který spolu souvisí, a neměl u sebe kód, který spolu nesouvisí.
Název: Re:Java - kdy používat statické metody/atributy
Přispěvatel: hawran diskuse 16. 04. 2016, 11:11:35
Dotaz zní: kdy používat statické třídy/metody/atributy tak, aby se z toho Javistovi nenaježily vlasy hrůzou? Je problém mít třídu, ve které je metoda main, celou statickou? Tzn.: privátní statické atributy (ne nutně final) a privátní statické metody. Prostě taková inicializační třída. Půjdu ještě dál: dal bych celou třídu jako abstract. Jen tak, nikdy se nebude vytvářet její instance, tak proč ji nemít abstract. Je to ok?

Dále. Mám nějakou kořenovou abstraktní třídu. je problém si do ní dát pár statických metod jako utilitky, které nějak souvisí s děděnými třídami? Třeba budu chtít generovat speciální posloupnost číslic, dám to do této abstraktní třídy jako statickou public metodu. Prvotně je to "utilitka" pro potomky, ale třeba ji bude chtít použít i nějaká jiná třída, tak proč ji nemít static public. Je to velký problém? Jasně, mělo by se to dát zvlášť do nějakých Utils. Ale co když potřebuju jen 2 takové metody, vytvářet kvůli tomu zbytečně další třídu nějakých konkrétních Utils pro konkrétní sadu tříd? Ve které pak budou jen 1 nebo 2 metody?

Díky

@Zelenac: nebyla ti tu uz nekolikrat doporucovana Effectiva Java od Blocha, btw?
Název: Re:Java - kdy používat statické metody/atributy
Přispěvatel: Zelenacuv kamos 19. 04. 2016, 20:07:16
Diky za odpovedi, uz jsem zase o něco skvělEjší než jsem byl   8)