V programovaní často dochádza k takému zmätku, niektoré funkcie sa riešia pomocou singletonov, iné statickými metódami, takže aké sú princípy a scenáre použitia statických metód a singletonov? Poďme si to dnes objasniť.
1. Najprv sa pozrime na rozdiel medzi statickými a nestatickými metódami?
Mnohí programátori chápu, že statické metódy sa načítavajú ako prvé, nestatické metódy až neskôr, statické metódy budú vždy existovať v pamäti a nestatické metódy nie. Preto sa odporúča používať nestatickú metódu. V prvom rade je nesprávne zdôrazňovať, že toto chápanie je nesprávne.
Najprv analyzujme z pamäti, že keď je aplikácia inicializovaná, CLR (CLR je Common Language Runtime) je zároveň runtime prostredie podobne ako Java virtuálny stroj, ktorý je zodpovedný za správu zdrojov (alokácia pamäte a garbage collection atď.) a zabezpečuje potrebné oddelenie medzi aplikáciou a základným operačným systémom. CLR má dva rôzne prekladové názvy: Common Language Runtime a Common Language Runtime. Priraďuje adresný priestor každému procesu v dostupnom priestore procesu, ktorým je spravovaná halda. Spravovaná halda je rozdelená do viacerých regiónov, z ktorých najdôležitejšie sú garbage collection heap (GC Heap) a loader heap (Loader Heap), ktorá sa používa na ukladanie objektových inštancií a je spravovaná GC. Najdôležitejšie informácie, ktoré Loader Heap ukladá cez tabuľku MethodTable, sú informácie súvisiace s metadátami, ako sú typy základov, statické polia, implementačné rozhrania a všetky metódy. Loader Heap neakceptuje kontrolu cez GC a jeho životný cyklus je od vytvorenia až po zničenie. Inými slovami, po načítaní triedy sa statické aj nestatické metódy tejto triedy ukladajú do tabuľky MethodTab v Load Heap bez kontroly GC a všetky sú uložené v pamäti pri prvom načítaní.
Aký je rozdiel medzi statickou metódou a nestatickou metódou? Rozdiel je v tom, že pri vytváraní objektu má statická metóda len kópiu, zatiaľ čo nestatická metóda skopíruje kópiu informácií o tejto inštancii na GC Heap pre každý nový objekt a zároveň nový objekt umiestni na zásobník. Adresa, na ktorú ukazuje ukazovateľ zásobníka, je pamäťová adresa, ktorá bola práve skopírovaná do haldy GC. Preto sú statické metódy z hľadiska rýchlosti volania metód rýchlejšie, pretože nestatické metódy je potrebné inštancionovať a prideľovať pamäť.
Z pohľadu histórie programovania boli takmer všetky metódy raného štruktúrovaného programovania statické metódy a zavedenie metód inštancie bolo otázkou objektovo orientovaného programovania, takže metóda inštanciácie nemala riešiť problém efektivity behu a pamäte. Cieľom je urobiť vývoj viac vzorovým a objektovo orientovaným.
Z vyššie uvedenej analýzy možno vyvodiť záver: 1. Statická metóda a nestatická metóda rozlišujú medzi režimom riešenia. 2. Ak dedičnosť, polymorfizmus alebo ak metóda nemá nič spoločné s objektom svojej triedy, mali by ste zvoliť statickú metódu, napríklad triedu nástrojov.
2. Aký je rozdiel medzi singleton módom a statickou metódou?
Niekedy potrebujeme udržiavať nejakú informáciu v inžinierstve, napríklad niektoré konfiguračné atribúty, ktoré sa načítavajú za behu, musia existovať počas celej životnosti aplikácie a sú verejné, takže stačí len jedna kópia. V súčasnosti zvážime použitie singletonu alebo statickej metódy na udržiavanie týchto dát, ale v tomto momente, keď sa tieto dáta získavajú objektovo-orientovaným spôsobom, použijeme singleton.
Po prvé, statické metódy sú založené na triedach a singletony sú založené na objektoch. Ak je rozlišovací vzor objektový, použite singleton, inak použite statický prístup. Napríklad je potrebné dediť triedy, implementovať rozhrania, oneskoriť inicializáciu, prepísať rodičovské triedy atď., aby ste používali singletony, po druhé, statické metódy sú procesovo orientované a singletony objektovo-orientované. Po tretie, statické atribútové premenné nebudú vymazané GC, takže singleton objekty nebudú vymazané GC a objekty generované statickými metódami budú uvoľnené pri vykonaní statickej metódy. |