Recent, am fost invitat la o companie pentru un interviu pentru postul de Java-programator. La interviu am vorbit despre metoda Finalize. Am avut doar o înțelegere superficială a funcționării acestei metode nu a fost în măsură să dea o descriere decentă a intervyuveram sale. Prin urmare, după interviu, a trebuit să lucreze la bug-uri pentru a înțelege.
Cunoștințele mele se limitează la ceea ce a finaliza metoda se numește atunci când colectorul de gunoi începe să cedeze obiectului. Și eu nu înțeleg ce este. Am crezut că a fost ceva de genul un destructor, care poate scuti anumite resurse atunci când nu mai sunt necesare, și chiar și resursele care sunt stocate în alte locații, care nu este adevărat.
Deci, primul lucru este necesar pentru a înțelege - numirea.
Am proiectat această metodă pentru resursele de sistem automat de eliberare ocupate de obiectul pe care este invocat această metodă. Se pare convenabil, nu ar trebui să-și amintească tot timpul, de exemplu, că trebuie să închidă conexiunea cu unele resurse atunci când nu mai este necesară.
Este posibil ca această metodă nu va fi numit deloc. Aceasta se poate întâmpla atunci când obiectul a devenit disponibil pentru colectarea gunoiului și programul se termină.
O caracteristică interesantă a acestei metode este că se poate face din nou un obiect disponibile, această atribuindu orice variabilă, deși nu este recomandat să facă acest lucru, deoarece atunci când restaurarea unui obiect, acesta nu re-finalize va fi numit
Se poate întâmpla este un alt moment rar. Avem o clasa A, care pune în aplicare metoda finalize. Vom crea o clasa B se extinde A, care uita de finalize. Facilitățile de clasă B conține o cantitate mare de date. Atunci când un obiect de clasa B, nu mai sunt necesare, ele vor cădea în loc și pentru a finaliza anumită perioadă de timp va ocupa în continuare de memorie, în loc de ceea ce ar ocoli coada și imediat eliminate.
Un alt dezavantaj este acela că este necesar să ne amintim despre apelul metoda Definitivarea, super-clasă, dacă o redefini. Dezvoltatorul nu produce - nici o cauza.
Excepțiile aruncate prin metoda finaliza, finalizer prelucrat nu-flow, adică stektreys acest lucru probabil nu va fi urmărită.
Există o cale de a fi sigur că au fost lansate metode de-Finalizare obiectele care sunt disponibile pentru asamblare: cauza System.runFinalization () sau Runtime.getRuntime () runFinalization () .. Ieșirea metodei se realizează numai atunci când toate metodele disponibile de obiecte vor fi efectuate pentru a finaliza
Pentru mine, am ajuns la concluzia că utilizarea în mod inutil această metodă nu este necesară, iar cazurile de necesitate specială practica mea în vârstă de doi ani și jumătate de ani, nu a fost încă îndeplinit.
O mai bună în loc să finalizeze tehnici de scriere, cum ar fi aproape de java.io și le numim în blocul în cele din urmă. Dezavantajul este că razrabotkik trebuie să ne amintim că, după utilizarea resursei ar trebui să fie închise. Pentru a ne ajuta să vină aici Java SE 7 cu lor încearcă cu resurse-
Dar această metodă pentru ceva de mâncare. Unde și cum pot să-l folosesc? Există exemple de utilizare?
Definitivarea poate fi folosit ca o ultimă șansă de a închide resursa, dar niciodată ca prima sau singura incercare. Ie în plus față de faptul că clientul poate apela, de exemplu, închide o metodă pe obiectul care reprezintă resursa. Și poate uita. Apoi, putem încerca să-l ajute. Acest lucru se face, de exemplu, în FileInputStream.java clasă:
Această abordare este adesea folosit în bibliotecile Java.