Фіналізатор
Перейти до навігації
Перейти до пошуку
Фіналізатор — спеціальний метод в об'єктно орієнтованих мовах програмування, які використовують збирання сміття при управлінні пам'яттю. Він викликається середовищем виконання під час видалення об'єкта.
Фіналізатор об'єкта викликається у не визначений час після того як збирач сміття визначить об'єкт як невикористовуємий, але перед вивільненням пам'яті котру займає об'єкт.
Використання фіналізаторів має багато недоліків, тому рекомендується надавати перевагу шаблону Dispose.
У мовах ООП з безпосереднім управлінням пам'яттю, аналогом фіналізатора є деструктор.
- Фіналізатор не може бути викликаний в наперед заданий момент часу, чи може зовсім не викликатись.
- Під час виклику фіналізатора, неможливо знати стан інших частин програми. Тому обробка винятків із фіналізатора зазвичай не можлива.
- Неможливо викликати фіналізатори в бажаному порядку.
- Під час виклику фіналізатора, інваріант класу уже може не виконуватись.
- Фіналізатор може спричинити воскресіння об'єкта. Це уповільнить виконання фіналізаторів та може спричинити помилки у програмі.
- Якщо дефіцитні ресурси звільняються у фіналізаторі, то це може спричинити ресурсний голод.
- Фіналізатори викликаються із збирача сміття, який реагує на дефіцит пам'яті, тому не пристосовані боротись із дефіцитом ресурсів інших типів.
- Фіналізатор може спричинити проблеми синхронізації навіть у програмі із однією ниткою виконання, оскільки фіналізатори виконуються окремою ниттю. Навіть може спричинити взаємне блокування.
- Фіналізатори зазвичай не виконуються під час завершення програми, оскільки можуть завадити завершенню.
- Брюс Эккель. Философия Java. Библиотека программиста. 4-е изд. - СПб: Питер, 2009. ISBN 978-5-388-00003-3
- Joshua Bloch. Effective Java. Addison-Westley, 2001.