A véglegesítési módszer, a bezárható felület és az erőforrásokkal próbálkozás utasítás (Java 7) - 1

– Szia Amigo!

"Úgy döntöttem, hogy megbeszélem veled a véglegesítés () módszert."

"Ha emlékszel, a finalize() egy speciális metódus, amelyet egy objektum hív meg, mielőtt a szemétgyűjtő megsemmisítené."

"Ennek a módszernek a fő célja a használt külső, nem Java erőforrások felszabadítása fájlok, I/O adatfolyamok és így tovább bezárásával."

"Sajnos ez a módszer nem váltja be a hozzá fűzött reményeket. A Java virtuális gép addig halogathatja egy objektum megsemmisítését, mint a finalize metódus meghívását. Ráadásul nem garantálja, hogy ez a metódus Egyáltalán hívják. Rengeteg olyan helyzet van, amikor nem hívják, mindezt az "optimalizálás" nevében."

"Két referenciám van az Ön számára:"

Joshua Bloch írt egy jó cikket erről a módszerről: link
Átfogalmazok egy rövid részletet:

  1. A finalize() csak két esetben használható:
    1. Erőforrások naplózással történő ellenőrzéséhez vagy tisztításához.
    2. Ha olyan natív kóddal dolgozik, amely nem kritikus az erőforrásszivárgás szempontjából.
  2. A finalize() 430-szor lassítja a GC-t az objektumok tisztításában
  3. Lehetséges, hogy a finalize() nem hívható meg
Ha azt mondanám egy interjúban, hogy a finalize ártalmas és veszélyes mankó, amelynek már a létezése is zavaros, igazam lenne?

– Nos, ez feldobta a napomat, Ellie.

"A Java 7 egy új utasítással helyettesíti a véglegesítési módszert. Ez az úgynevezett " try-with-resources" . Ez valójában nem helyettesíti a véglegesítést , inkább egy alternatív megközelítés."

"Ez olyan, mint a "try-catch", de erőforrásokkal?

"Majdnem olyan, mint a try-catch . A helyzet az, hogy a finalize () metódussal ellentétben a try- catch-finally utasításban mindig végrehajtódik a végleges blokk . A programozók is alkalmazták ezt a technikát, amikor erőforrásokat kellett felszabadítaniuk, szálak bezárása stb.
 "Íme egy példa:"

InputStream is = null;
try
{
 is = new FileInputStream("c:/file.txt");
 is.read(…);
}
finally
{
 if (is != null)
 is.close();
}

"Függetlenül attól, hogy a try blokk megfelelően futott-e le, vagy volt kivétel, mindig a végleges blokk kerül meghívásra, és ott fel lehet szabadítani a foglalt erőforrásokat."

"Tehát a Java 7-ben az a döntés született, hogy hivatalossá teszik ezt a megközelítést, például:"

try(InputStream is = new FileInputStream("c:/file.txt"))
{
 is.read(…);
}

"Ezt a speciális try utasítást try-with-resources-nak hívják (hasonlóan ahhoz, ahogy a gyűjteményeknek van egy alternatívája a foreach -nek ) ."

"Figyelje meg, hogy a try után zárójelek vannak, ahol a változókat deklarálják és objektumokat hoznak létre. Ezek az objektumok a zárójelekkel jelzett try blokkon belül használhatók. Amikor a try blokk végrehajtása befejeződött, függetlenül attól, hogy normálisan végződött-e vagy ott kivétel volt, a close() metódus minden, a zárójelben lévő objektumon meghívásra kerül."

"Milyen érdekes! Ez a jelölés sokkal tömörebb, mint az előző. Még nem vagyok benne biztos, hogy értem."

– Nem olyan nehéz, mint gondolod.

"Szóval, megadhatom az egyes objektumok osztályát a zárójelben?"

– Igen, persze, különben nem sok haszna lenne a zárójelnek.

"És ha a try blokkból való kilépés után másik metódust kell hívnom, hova tegyem?"

"Itt a dolgok egy kicsit finomabbak. A Java 7 a következő felületet vezeti be:"

public interface AutoCloseable
{
 void close() throws Exception;
}

"Az Ön osztálya megvalósíthatja ezt a felületet. Ezután használhatja objektumait egy try-with-resources utasításban. Csak ilyen objektumok hozhatók létre a try-with-resources utasítás zárójelében az «automatikus bezáráshoz»."

"Más szóval, felül kell írnom a bezárási metódust, és kódot kell írnom bele, hogy «megtisztítsam» az objektumot, és nem tudok másik metódust megadni?

"Igen. De megadhat több objektumot is – csak pontosvesszővel válassza el őket:"

try(
InputStream is = new FileInputStream("c:/file.txt");
OutputStream os = new FileOutputStream("c:/output.txt")
)
{
 is.read(…);
 os.write(…);
}

– Ez jobb, de nem olyan menő, mint reméltem.

"Nem olyan rossz. Meg fogod szokni. Idővel."