Фіналізатор

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Фіналізатор — спеціальний метод в об'єктно орієнтованих мовах програмування, які використовують збирання сміття при управлінні пам'яттю. Він викликається середовищем виконання під час видалення об'єкта.

Фіналізатор об'єкта викликається у не визначений час після того як збирач сміття визначить об'єкт як невикористовуємий, але перед вивільненням пам'яті котру займає об'єкт.

Використання фіналізаторів має багато недоліків, тому рекомендується надавати перевагу шаблону Dispose.

У мовах ООП з безпосереднім управлінням пам'яттю, аналогом фіналізатора є деструктор.

Недоліки

[ред. | ред. код]
  • Фіналізатор не може бути викликаний в наперед заданий момент часу, чи може зовсім не викликатись.
  • Під час виклику фіналізатора, неможливо знати стан інших частин програми. Тому обробка винятків із фіналізатора зазвичай не можлива.
  • Неможливо викликати фіналізатори в бажаному порядку.
  • Під час виклику фіналізатора, інваріант класу уже може не виконуватись.
  • Фіналізатор може спричинити воскресіння об'єкта. Це уповільнить виконання фіналізаторів та може спричинити помилки у програмі.
  • Якщо дефіцитні ресурси звільняються у фіналізаторі, то це може спричинити ресурсний голод.
  • Фіналізатори викликаються із збирача сміття, який реагує на дефіцит пам'яті, тому не пристосовані боротись із дефіцитом ресурсів інших типів.
  • Фіналізатор може спричинити проблеми синхронізації навіть у програмі із однією ниткою виконання, оскільки фіналізатори виконуються окремою ниттю. Навіть може спричинити взаємне блокування.
  • Фіналізатори зазвичай не виконуються під час завершення програми, оскільки можуть завадити завершенню.

Джерела

[ред. | ред. код]
  • Брюс Эккель. Философия Java. Библиотека программиста. 4-е изд. - СПб: Питер, 2009. ISBN 978-5-388-00003-3
  • Joshua Bloch. Effective Java. Addison-Westley, 2001.