Často dochází k takovému zmatku v programování, některé funkce se řeší pomocí singletonů a některé statickými metodami, takže jaké jsou principy a scénáře použití statických metod a singletonů? Pojďme si to dnes ujasnit.
1. Nejprve se podívejme na rozdíl mezi statickými a nestatickými metodami?
Mnoho programátorů má představu, že statické metody se načítají jako první, nestatické metody se načítají až později, statické metody budou vždy existovat v paměti a nestatické metody ne. Proto se doporučuje používat nestatickou metodu. Především je chybné zdůrazňovat, že toto chápání je chybné.
Nejprve si z paměti analyzujme, že když je aplikace inicializována, CLR (CLR je běžný jazyk) je zároveň runtime prostředí podobné virtuálnímu stroji Java, které je zodpovědné za správu zdrojů (alokace paměti, garbage collection atd.) a zajišťuje potřebné oddělení mezi aplikací a základním operačním systémem. CLR má dva různé překladové názvy: Common Language Runtime a Common Language Runtime. Každému procesu přiděluje adresní prostor v dostupném prostoru procesu, což je spravovaná halda. Spravovaná halda je rozdělena do několika oblastí, z nichž nejdůležitější jsou garbage collection halda (GC halda) a loader halda (Loader Heap), která slouží k ukládání objektových instancí a je spravována GC. Nejdůležitější informace, které Loader Heap ukládá prostřednictvím tabulky MethodTable, jsou informace související s metadaty, jako jsou typy základů, statická pole, implementační rozhraní a všechny metody. Loader Heap nepřijímá kontrolu GC a jeho životní cyklus probíhá od vytvoření až po zničení. Jinými slovy, jakmile je třída načtena, jsou statické i nestatické metody této třídy uloženy v tabulce MethodTab v Load Heap bez kontroly GC a všechny jsou uloženy v paměti pro první načítání.
Jaký je rozdíl mezi statickou a nestatickou metodou? Rozdíl je v tom, že při vytváření objektu má statická metoda pouze kopii, zatímco nestatická metoda zkopíruje kopii informací o této instanci na GC Heap pro každý nový objekt a zároveň nový objekt umístí na zásobník. Adresa, na kterou ukazuje ukazatel zásobníku, je paměťová adresa, která byla právě zkopírována do GC Heap. Proto jsou statické metody z hlediska rychlosti volání metod rychlejší, protože je třeba instancovat nestatické metody a alokovat paměť.
Z hlediska historie programování byly téměř všechny metody raného strukturovaného programování statické metody a zavedení metod instancování bylo otázkou objektově orientovaného programování, takže metoda instancování neměla řešit problém efektivity provozu a paměť. Cílem je učinit vývoj více vzorem a objektově orientovaným.
Z výše uvedené analýzy lze vyvodit závěr: 1. Statická metoda a nestatická metoda rozlišují mezi režimem řešení. 2. Pokud dědičnost, polymorfismus nebo pokud metoda nemá nic společného s objektem své třídy, měli byste zvolit statickou metodu, například třídu nástrojů.
2. Jaký je rozdíl mezi singleton módem a statickou metodou?
Někdy musíme v inženýrství udržovat nějakou informaci, například některé konfigurační atributy, které se načítají za běhu, a které musí existovat po celou dobu existence aplikace a jsou veřejné, takže stačí jen jedna kopie. V tuto chvíli budeme uvažovat o použití singletonu nebo statické metody pro správu těchto dat, ale pokud jsou tato data získávána objektově orientovaným způsobem, použijeme singleton.
Za prvé, statické metody jsou založené na třídách a singletony jsou založené na objektech. Pokud je vzor rozlišení objektově založený, použijte singleton, jinak použijte statický přístup. Například je potřeba dědit třídy, implementovat rozhraní, zpozdit inicializaci, přepsat třídy rodičů atd., aby se používaly singletony, za druhé, statické metody jsou procesově orientované a singletony objektové. Za třetí, statické atributové proměnné nebudou vymazávány GC, takže singleton objekty nebudou vymazány GC, a objekty generované statickými metodami budou uvolněny při spuštění statické metody. |