У програмуванні часто виникають такі плутанини: деякі функції розв'язуються за допомогою синглтонів, а деякі — статичними методами, тож які принципи та сценарії використання статичних методів і синглтонів? Давайте сьогодні прояснимо це питання.
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, тому об'єкти singleton не будуть очищені GC, а об'єкти, згенеровані статичними методами, будуть звільнені при виконанні статичного методу. |