В программировании часто возникает такая путаница: некоторые функции решаются с помощью синглтонов, а некоторые — статическими методами, так каковы принципы и сценарии использования статических методов и синглтонов? Давайте сегодня проясним этот вопрос.
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. В чём разница между однотонным режимом и статическим методом?
Иногда нам нужно поддерживать часть информации в инженерии, например, некоторые атрибуты конфигурации, загружаемые во время выполнения и которые должны существовать на протяжении всего срока жизни приложения и быть публичными, поэтому требуется только одна копия. В данный момент мы рассмотрим возможность использования одиночного или статического метода для поддержания этих данных, но в данный момент эти данные получаются объектно-ориентированным способом, мы будем использовать синглтон.
Во-первых, статические методы основаны на классах, а синглтоны — на объектах. Если узор разрешения основан на объектах, используйте синглтон, в противном случае — статический подход. Например, нужно наследовать классы, реализовать интерфейсы, инициализацию с задержкой, переписывать родительские классы и т.д., чтобы использовать синглтоны, во-вторых, статические методы ориентированы на процесс, а синглтоны — на объекты. В-третьих, статические атрибутные переменные не будут очищены GC, поэтому объекты синглтона не будут очищены GC, а объекты, сгенерированные статическими методами, будут освобождены при выполнении статического метода. |