
– 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:
|
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."
GO TO FULL VERSION