Финализатор

Финализа́тор в объектно-ориентированных языках программирования, использующих механизм сборки мусора, — специальный метод, вызываемый средой исполнения перед удалением объекта сборщиком мусора.

Определение

Финализатор — это метод класса, который автоматически вызывается средой исполнения в промежутке времени между моментом, когда объект этого класса опознаётся сборщиком мусора как неиспользуемый, и моментом удаления объекта (освобождения занимаемой им памяти). Финализатор для конкретного объекта всегда выполняется после того, как программа прекращает использовать данный объект и до того, как занимаемая объектом память будет освобождена сборщиком мусора. Удобно считать, что финализатор вызывается непосредственно перед удалением объекта из памяти, хотя это обычно не гарантируется.

Отличие от деструкторов

Внешне финализатор схож с деструктором класса, однако в действительности эффект действия и область применения этих методов существенно различаются. Различие вызвано тем, что момент вызова финализатора, в отличие от деструктора, не определён жёстко: финализатор всегда вызывается перед уничтожением объекта сборщиком мусора, но момент уничтожения зависит от режима работы сборщика мусора, объёма доступной оперативной памяти и активности использования памяти программой. Так, если свободной памяти мало и создание новых объектов происходит постоянно, потребность в сборке мусора возникает часто и финализатор, соответственно, с высокой вероятностью будет вызван вскоре после прекращения использования объекта. Если же памяти много, а потребление её программой мало, то от прекращения использования объекта до сборки мусора (и вызова финализатора) может пройти длительное время. Более того, если памяти много и новые объекты почти или совсем не создаются, то сборщик мусора может вообще не вызываться, а по завершении программы вся выделенная ей память будет просто возвращена операционной системе; в этом случае финализатор, возможно, вообще не будет вызван.

В то время как деструкторы очень часто используются для освобождения занятых объектом дефицитных системных ресурсов (таких как доступ к файлу или к аппаратному обеспечению), финализаторы, ввиду отмеченных выше особенностей, использовать подобным образом обычно не рекомендуется. Безусловно, финализатор может закрывать файл или сообщать операционной системе, что устройство более не используется, однако от момента прекращения использования объекта до момента вызова финализатора может пройти неопределённое количество времени, и всё это время занятые объектом ресурсы не будут использоваться, но будут оставаться занятыми.[1]

Финализаторы непредсказуемы, зачастую опасны и, чаще всего, не нужны.

Joshua Bloch. Effective Java. Addison-Westley, 2001.

Вследствие сказанного, применение финализаторов весьма ограниченно. Для освобождения ресурсов в языках со сборкой мусора используется шаблон проектирования «dispose». Язык программирования C# поддерживает шаблон «dispose» неявно через интерфейс IDisposable и ключевое слово using, в Java 7 введён аналогичный механизм «try-with-resources».

Оправданное применение

Один из редких случаев, когда финализатор действительно необходим — реализация классом собственных механизмов работы с памятью, опирающихся на сторонний код, не управляемый системой сборки мусора, например, когда класс Java использует код, написанный на C, чтобы достичь максимальной эффективности или выполнить низкоуровневые операции. Для работы внешнего кода память должна выделяться с помощью стандартных для C механизмов (malloc) и освобождаться с их же помощью (free). Обратиться к функции выделения памяти можно (и, как правило, нужно) в конструкторе класса, а самое правильное место для вызова внешней функции освобождения памяти — как раз финализатор, так как это расположение гарантирует, что память для внешнего кода будет выделена до использования объекта (при его создании) и освобождена только после прекращения его использования. Если финализатор будет вызван не сразу или даже не будет вызван вообще — ничего страшного не случится, поскольку выделенная внешняя память всё равно будет возвращена системе по завершении работы программы автоматически.

Другой удачный способ применения финализатора — проверка очистки объекта перед удалением. Если объект при создании или по ходу своей работы захватывает ценные системные ресурсы, кроме памяти (открывает файлы или коммуникационные каналы, подключается к устройствам ввода-вывода), то, очевидно, в момент удаления объекта сборщиком мусора все эти ресурсы должны быть уже освобождены (то есть объект должен быть очищен). Ошибки очистки (когда объект в некоторых ситуациях не очищается или, что ещё хуже, очищается не полностью) очень коварны, их сложно выявлять, так как проявляются они при выполнении совсем не той части кода, где допущена ошибка. Как уже говорилось, проводить очистку в финализаторе неразумно, так как неизвестно, когда он будет вызван и вызовется ли вообще. Зато в финализаторе вполне уместно и удобно провести проверку того, полностью ли очищен объект, и выдать, в той или иной форме, сообщение об ошибке, если какой-то ресурс остался захваченным. Неважно, что финализатор может быть вызван поздно и не каждый раз; всё равно, если ошибка очистки объекта имеется, то рано или поздно финализатор «поймает» её.

Примеры

Создаваться финализаторы могут по-разному. В некоторых языках финализатор является частью стандартной библиотеки. Обычно в таких случаях он является виртуальным методом стандартного корневого класса, потомками которого являются все остальные классы в системе (в Java это метод finalize() класса Object). Могут финализаторы объявляться и с помощью специального синтаксиса. В C# синтаксис объявления финализатора позаимствован от деструкторов C++ — финализатором для класса Class становится метод с сигнатурой ~Class(). В языке Nemerle, построенном на основе C#, от этого синтаксиса отказались, поскольку сочли его провоцирующим ошибки.

Примечания

Литература

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

Read other articles:

España10.º puesto Titular Alternativo Datos generales Asociación RFEF Confederación UEFA Seudónimo La roja Ranking FIFA 10.º lugar (junio de 2018) Participación 15.ª Mejor resultado Campeón (2010) Entrenador Fernando Hierro Estadísticas Partidos 4 Goles anotados 7 (1.75 por partido) Goles recibidos 6 (1.5 por partido) Goleador Diego Costa (3 goles) Cronología Anterior Brasil 2014 Siguiente Catar 2022 La selección de fútbol de España fue una de las 32 selecciones que participaro...

 

Agama knobeli Status konservasiRisiko rendahIUCN120683982 TaksonomiKerajaanAnimaliaFilumChordataKelasReptiliaOrdoSquamataFamiliAgamidaeGenusAgamaSpesiesAgama knobeli Boulenger dan Power, 1921 lbs Agama knobeli, atau agama batu selatan, adalah sebuah spesies kadal dalam keluarga Agamidae. Spesies tersebut adalah kadal kecil yang ditemukan di Namibia.[2] Referensi ^ Bauer, A.M. & Becker, F. (2020). Agama knobeli. 2020: e.T120683982A120906393. doi:10.2305/IUCN.UK.2020-3.RLTS.T1206839...

 

الجبهة الشرقية جزء من مسرح أحداث أوروبا خلال الحرب العالمية الأولى    التاريخ وسيط property غير متوفر. بداية 17 أغسطس 1914  نهاية 3 مارس 1918  الموقع أوروبا الوسطى،  وأوروبا الشرقية  تعديل مصدري - تعديل     لمعانٍ أخرى، طالع الجبهة الشرقية (توضيح). أسرى حرب روس...

Never TwicePoster promosiHangul두 번은 없다 Ditulis olehGoo Hyun-sookSutradaraChoi Won-sukPemeranPark Se-wanKwak Dong-yeonYoun Yuh-jungOh Ji-hoYe Ji-wonPark Ah-inSong Won-seokNegara asalKorea SelatanBahasa asliKoreaJmlh. episode72ProduksiPengaturan kameraSingle-cameraDurasi35 menitRumah produksiPan Entertainment[1]DistributorMBCRilis asliJaringanMBC TVFormat audioDolby DigitalRilis2 November 2019 (2019-11-02) –7 Maret 2020 (2020-3-7) Never Twice (Hangul:...

 

Fosfin. Fosfina adalah nama umum dari fosforus hidrida (PH3), juga disebut dengan nama fosfana (phosphane), dan kadang-kadang fosfamina. Fosfina merupakan gas tak berwarna dan dapat terbakar dengan titik didih 88 °C. Fosfina murni tidak berbau. Fosfina merupakan zat yang beracun. Pranala luar International Chemical Safety Card 0694 Diarsipkan 2009-02-24 di Wayback Machine. Artikel bertopik kimia ini adalah sebuah rintisan. Anda dapat membantu Wikipedia dengan mengembangkannya.lbs Pengaw...

 

Ted KoppelLahir2 Agustus 1940 (umur 83)Lancashire, InggrisPendidikanUniversitas Syracuse, Universitas StanfordPekerjaanwartawan Edward James Ted Koppel (lahir 8 Februari 1940) adalah wartawan Amerika Serikat yang dikenal sebagai mantan presenter berita Nightline. Koppel telah memenangi berbagai penghargaan di bidang penyiaran, di antaranya 37 Penghargaan Emmy, 6 Penghargaan Peabody, 10 Penghargaan duPont-Columbia.[1] Karier Ted Koppel dilahirkan di Lancashire, Inggris sebagai an...

This list is incomplete; you can help by adding missing items. (March 2014) This is a list of museums in Saudi Arabia. Museums in Saudi Arabia Nasseef House, Saudi Arabia National Museum of Saudi Arabia Al Bassam Heritage House Clock Tower Museum Dar Al Madinah Museum Darat Safeya Bizagr Hafouf National Museum Hejaz Railway Museum Humane Heritage Museum Jadeah Museum Jeddah Regional Museum of Archaeology and Ethnography Al-Jouf Museum of Archaeology and Folklore King Abdulaziz Historical Cen...

 

Ignaz Philipp SemmelweisIgnace Philippe Semmelweis (1860)BiographieNaissance 1er juillet 1818Tabán (royaume de Hongrie, empire d'Autriche)Décès 13 août 1865 (à 47 ans)Oberdöbling (en) (empire d'Autriche)Sépulture Musée Semmelweis sur l'histoire de la médecineNationalités autrichiennehongroiseFormation Gymnase catholique de Budapest (d) (jusqu'en 1835)Université Loránd-Eötvös (jusqu'en 1841)Université de Vienne (jusqu'en 1844)Activités Médecin, gynécologue, obstétricien...

 

US Supreme Court justice from 1943 to 1949 Wiley RutledgeRutledge, c. 1943-49Associate Justice of the Supreme Court of the United StatesIn officeFebruary 15, 1943 – September 10, 1949Nominated byFranklin D. RooseveltPreceded byJames F. ByrnesSucceeded bySherman MintonAssociate Justice of the United States Court of Appeals for the District of ColumbiaIn officeMay 2, 1939 – February 14, 1943Nominated byFranklin D. RooseveltPreceded bySeat established by 52 Stat. 584S...

705th Combat Training SquadronParticipants in Virtual Flag 19-4 at Kirtland AFBActive2003–presentCountry United StatesBranch United States Air ForceRoleVirtual exercise and training managementSize175 military and contractorPart ofAir Combat CommandGarrison/HQKirtland AFB, New MexicoDecorationsAir Force Outstanding Unit AwardInsignia705th Combat Training Squadron emblem (Approved 15 March 2004)[1]Military unit The 705th Combat Training Squadron is a United States Air ...

 

BaywatchZac Efron, Dwayne Johnson e Alexandra Daddario in una scena del filmLingua originaleinglese Paese di produzioneStati Uniti d'America Anno2017 Durata116 min121 min (extended cut) Rapporto2,39:1 Genereazione, commedia RegiaSeth Gordon Soggettodalla serie tv creata da Michael Berk, Gregory J. Bonann e Douglas Schwartzda una storia di Robert Ben Garant, Thomas Lennon, David Ronn e Jay Scherick SceneggiaturaDamian Shannon, Mark Swift ProduttoreMichael Berk, Gregory J. Bonann, Beau Flyn...

 

  「俄亥俄」重定向至此。关于其他用法,请见「俄亥俄 (消歧义)」。 俄亥俄州 美國联邦州State of Ohio 州旗州徽綽號:七葉果之州地图中高亮部分为俄亥俄州坐标:38°27'N-41°58'N, 80°32'W-84°49'W国家 美國加入聯邦1803年3月1日,在1953年8月7日追溯頒定(第17个加入联邦)首府哥倫布(及最大城市)政府 • 州长(英语:List of Governors of {{{Name}}}]]) •&...

此條目可参照英語維基百科相應條目来扩充。 (2021年5月6日)若您熟悉来源语言和主题,请协助参考外语维基百科扩充条目。请勿直接提交机械翻译,也不要翻译不可靠、低品质内容。依版权协议,译文需在编辑摘要注明来源,或于讨论页顶部标记{{Translated page}}标签。 约翰斯顿环礁Kalama Atoll 美國本土外小島嶼 Johnston Atoll 旗幟颂歌:《星條旗》The Star-Spangled Banner約翰斯頓環礁�...

 

American politician and judge (born 1957) Jennifer BrunnerJustice of the Ohio Supreme CourtIncumbentAssumed office January 2, 2021Preceded byJudith L. FrenchJudge of the Ohio Court of Appealsfrom the 10th districtIn officeJanuary 20, 2015 – December 31, 2020Preceded byAmy O'GradySucceeded byLisa Sadler49th Secretary of State of OhioIn officeJanuary 8, 2007 – January 10, 2011GovernorTed StricklandPreceded byKen BlackwellSucceeded byJon Husted Personal detailsBorn (195...

 

Road in Japan National Route 466国道466号Route informationLength18.4 km[1] (11.4 mi)Existed6 May 1993–presentMajor junctionsNorth end National Route 246 at SetagayaSouth end Mitsuzawa Route at Hodogaya-ku, Yokohama LocationCountryJapan Highway system National highways of Japan Expressways of Japan ← National Route 465→ National Route 467 National Route 466 (国道466号, Kokudō Yonhyaku roku-jurokugō) is a national highway in Japan co...

الإقليم الأوروبي للمرشدات الإقليم الأوروبي للمرشدات المالك الجمعية العالمية للمرشدات وفتيات الكشافة المقر بروكسل، بلجيكا الموقع بروكسل، بلجيكا الدولة بلجيكا  الموقع الإلكتروني https://www.wagggs.org/en/our-world/europe-region/ تعديل مصدري - تعديل   الإقليم الأوروبي للمرشدات هو المكتب ا...

 

This list is incomplete; you can help by adding missing items. (August 2008) Cinema ofthe Philippines Films before the 2010s Pre-1940   1940s   1950s   1960s1970s   1980s   1990s   2000s 2010s 2010   2011   2012   2013   2014 2015   2016   2017   2018   2019 2020s 2020   2021   2022   2023   2024 vte This is a list of films produced in the Philippines in the 2000s. 2000 Title Director Cast Genre Studio ...

 

مجزرة كنصفرة وكفرعويد جزء من الحرب الأهلية السورية معلومات عامة التاريخ 19 ديسمبر - 20 ديسمبر 2011 الموقع منطقة جبل الزاوية، محافظة إدلب، سوريا النتيجة نتائج المجزرة: سقوط مئات القتلى من أهالي المنطقة على أيدي الجيش. توجه المجلس الوطني السوري بدعوة إلى مجلس الأمن الدولي لعقد �...

كلية الطب بالقوات المسلحة الدولة  مصر الولاء  مصر النوع كلية الدور تعليمي جزء من القوات المسلحة المصرية المقر الرئيسي القاهرة شعار نصي العلم، الشرف، الوطن الموقع الرسمي www.afcm.ac.eg القادة القائد الحالي لواء طبيب/ ايمن شوقي تعديل مصدري - تعديل   كلية الطب العسكرية هي أح...

 

Road bearing more than one route number An extreme example: I-40, I-85 Business, US 29, US 70, US 220, and US 421 formerly ran concurrently in Greensboro, North Carolina. In 2008, I-40 was rerouted off this road but was put back on it later that same year with US 220 being rerouted instead. US 421 was also rerouted in 2009. A concurrency in a road network is an instance of one physical roadway bearing two or more different route numbers.[1] When two roadw...