Często występuje takie zamieszanie w programowaniu – niektóre funkcje rozwiązuje się za pomocą singletonów, a inne za pomocą metod statycznych, więc jakie są zasady i scenariusze użycia metod statycznych i singletonów? Wyjaśnijmy to dzisiaj.
1. Przyjrzyjmy się najpierw różnicom między metodami statycznymi a niestatycznymi?
Wielu programistów rozumie, że metody statyczne ładują się najpierw, metody niestatyczne dopiero później, metody statyczne zawsze będą istnieć w pamięci, a metody niestatyczne nie. Dlatego zaleca się stosowanie metody niestatycznej. Przede wszystkim błędem jest podkreślanie, że takie rozumienie jest błędne.
Przede wszystkim przeanalizujmy z pamięci, że gdy aplikacja jest inicjalizowana, CLR (CLR to Common Language Runtime) jest również środowiskiem wykonawczym podobnym do maszyny wirtualnej Java, odpowiedzialnym za zarządzanie zasobami (alokacja pamięci i zbieranie śmieci itp.) oraz zapewnia niezbędne oddzielenie aplikacji od systemu operacyjnego. CLR ma dwie różne nazwy tłumaczeń: Common Language Runtime oraz Common Language Runtime. Przydziela każdemu procesowi przestrzeń adresową w dostępnej przestrzeni procesu, która jest zarządzaną kopcą. Zarządzany stos jest podzielony na wiele regionów, z których najważniejsze to kopca garbage collection (GC Heap) oraz kopca loadera (Loader Heap), która służy do przechowywania instancji obiektów i jest zarządzana przez GC. Najważniejszą informacją, którą Loader Heap przechowuje w tabeli MethodTable, są informacje związane z metadanymi, takie jak typy baz, pola statyczne, interfejsy implementacyjne oraz wszystkie metody. Loader Heap nie akceptuje kontroli GC, a jego cykl życia trwa od stworzenia do zniszczenia. Innymi słowy, po załadowaniu klasy zarówno statyczne, jak i niestatyczne metody tej klasy są przechowywane w tabeli MethodTab w Load Heap, bez kontroli GC, i wszystkie pozostają w pamięci podczas pierwszego ładowania.
Jaka jest różnica między metodą statyczną a metodą niestatyczną? Różnica polega na tym, że przy tworzeniu obiektu metoda statyczna ma tylko kopię, podczas gdy metoda niestatyczna kopiuje kopię informacji o tej instancji na kopii GC Heap dla każdego nowego obiektu, a jednocześnie umieszcza nowy obiekt na stosie. Adres wskazany przez wskaźnik stosu to adres pamięci, który właśnie został skopiowany do GC Heap. Dlatego pod względem szybkości wywołań metod statyczne metody są szybsze, ponieważ metody niestatyczne muszą być instancjonowane i alokowane pamięci.
Z perspektywy historii programowania niemal wszystkie metody wczesnego programowania strukturalnego były metodami statycznymi, a wprowadzenie metod instancjonowania było kwestią programowania obiektowego, więc metoda instancjonowania nie miała rozwiązać problemu efektywności i pamięci. Chodzi o to, by rozwój był bardziej wzorowy i zorientowany na obiekty.
Z powyższej analizy można wyciągnąć wniosek: 1. Metoda statyczna i metoda niestatyczna rozróżniają tryb rozwiązania. 2. Jeśli dziedziczenie, polimorfizm lub jeśli metoda nie ma nic wspólnego z obiektem swojej klasy, należy wybrać metodę statyczną, taką jak klasa narzędzi.
2. Jaka jest różnica między trybem singleton a metodą statyczną?
Czasami musimy utrzymywać jakąś informację w inżynierii, na przykład niektóre atrybuty konfiguracyjne ładowane w czasie działania, które muszą istnieć przez cały okres życia aplikacji i być publiczne, więc potrzebna jest tylko jedna kopia. Obecnie rozważymy użycie metody singleton lub statycznej do utrzymania tych danych, ale na ten moment, gdy dane są pozyskiwane w sposób obiektowy, użyjemy singleton.
Po pierwsze, metody statyczne są oparte na klasach, a singletony na obiektach. Jeśli wzór rozdzielczości jest oparty na obiektach, użyj singletona, w przeciwnym razie użyj podejścia statycznego. Na przykład trzeba dziedziczyć klasy, implementować interfejsy, opóźniać inicjalizację, przepisywać klasy nadrzędne itd., aby używać singletonów, po drugie, statyczne metody są zorientowane na proces, a singletony na obiekty. Po trzecie, statyczne zmienne atrybutów nie zostaną wyczyszczone przez GC, więc obiekty singleton nie zostaną wyczyszczone przez GC, a obiekty wygenerowane metodami statycznymi zostaną zwolnione po wykonaniu metody statycznej. |