Често имаме такова объркване в програмирането – някои функции се решават с сингълтони, а други със статични методи, така че какви са принципите и сценариите на употреба на статични методи и сингълтони? Нека изясним този въпрос днес.
1. Нека първо разгледаме разликата между статични и нестатични методи?
Много програмисти разбират, че статичните методи се зареждат първо, нестатичните методи се зареждат по-късно, статичните методи винаги ще съществуват в паметта, а нестатичните методи няма да съществуват. Затова се препоръчва използването на нестатичен метод. Първо, грешно е да се подчертава, че това разбиране е грешно.
Първо, нека анализираме от паметта, когато приложението е инициализирано, CLR (CLR е Common Language Runtime) също е среда за изпълнение като Java виртуалната машина, която отговаря за управлението на ресурси (разпределение на паметта и събиране на отпадъци и др.) и осигурява необходимото разделяне между приложението и основната операционна система. CLR има две различни преводачески имена: Common Language Runtime и Common Language Runtime. Отделя адресно пространство на всеки процес в наличното пространство на процеса, което е управляваната купчина. Управляваният куп е разделен на няколко региона, най-важните от които са купчината за събиране на боклук (GC Heap) и купчината за зареждане (Loader Heap), която се използва за съхранение на екземпляри на обекти и се управлява от GC. Най-важната информация, която Loader Heap съхранява чрез таблицата MethodTable, е информация, свързана с метаданни, като типове бази, статични полета, интерфейси за имплементация и всички методи. Loader Heap не приема контрол на GC и жизненият му цикъл е от създаване до унищожение. С други думи, след като класът бъде зареден, както статичните, така и нестатичните методи от този клас се съхраняват в таблицата MethodTab на Load Heap, без контрол от GC, и всички те са резидентни в паметта за първото зареждане.
Каква е разликата между статичен метод и нестатичен метод? Разликата е, че при създаване на обект статичният метод има само копие, докато нестатичният метод копира копие на информацията за този инстанс в GC Heap за всеки нов обект и едновременно с това поставя новия обект в стека. Адресът, посочен от указателя на стека, е адресът на паметта, който току-що е копиран в GC Heap. Следователно, що се отнася до скоростта на извикване на методи, статичните методи са по-бързи, защото нестатичните методи трябва да бъдат инстанцирани и да заделят памет.
От гледна точка на историята на програмирането, почти всички методи на ранното структурирано програмиране бяха статични, а въвеждането на методите за инстанциация беше въпрос на обектно-ориентирано програмиране, така че методът на инстанциация не беше за решаване на проблема с ефективността и паметта. Целта е да се направи развитието по-моделирано и обектно-ориентирано.
От горния анализ може да се направи заключение: 1. Статичният метод и нестатичният метод са разликата между режима на решение. 2. Ако наследяване, полиморфизъм или ако даден метод няма нищо общо с обекта на своя клас, трябва да изберете статичен метод, като клас инструмент.
2. Каква е разликата между еднотонен режим и статичния метод?
Понякога трябва да поддържаме информация в инженерството, като например някои конфигурационни атрибути, които се зареждат по време на изпълнение, които трябва да съществуват през целия живот на приложението и са публични, така че е необходима само една копия. В момента ще обмислим използването на сингълтон или статичен метод за поддържане на тези данни, но в момента тези данни се получават по обектно-ориентиран начин – ще използваме сингълтон.
Първо, статичните методи са базирани на класове, а сингълтъните са базирани на обекти. Ако резолуционният модел е обектно-базиран, използвайте сингълтон, в противен случай използвайте статичен подход. Например, трябва да наследяваш класове, да имплементираш интерфейси, да инициализираш забавяне, да пренаписваш родителски класове и т.н., за да използваш singletons, второ, статичните методи са ориентирани към процеси, а сингълтоните са обектно-ориентирани. Трето, статичните атрибутни променливи няма да бъдат изчистени от GC, така че обектите на singleton няма да бъдат изчистени от GC, а обектите, генерирани със статични методи, ще бъдат освободени при изпълнение на статичния метод. |