Ještě doplním, že může být vhodné tu pojistku doplnit assertem, který upozorní na to, že někdo někde tu úklidovou metodu zavolat zapomněl. Záleží pak na kontextu, jestli tohle stačí, nebo jestli je k tomu potřeba si táhnout nějakou další informaci – typicky v konstruktoru si (pod assertem) vytvořit výjimku, uložit si ji, při zavolání close() ji vymazat a ve finalize() otestovat její přítomnost, a pokud výjimka existuje, vyhodit jí.
S pozdravem Filip Jirsák -- [email protected] Dne 28. ledna 2010 11:44 Zdenek Tronicek <[email protected]> napsal(a): > Aplikacni programator udela nejlepe, kdyz na finalize() zapomene a misto > nej bude pouzivat metodu pro uklid a try + finally: > > InputStream is = ... > try { > ... > } finally { > is.close(); > } > > Pokud jde o to, zda ma finalize nekdy smysl, tak ano: muze to byt pojistka > pro pripad, ze programator zapomnel zavolat uklidovou metodu. Programator > by na to ovsem nemel spolehat a mel by se snazit, aby kazdy objekt po sobe > uklidil. > Jinak ten clanek, ktery uvadis, je z roku 98. Takze to asi nebude > nejvhodnejsi zdroj. > > Z.T. > -- > Zdenek Tronicek > FIT CTU in Prague > > > Ondra Medek napsal(a): > > Ahoj, > > > > navazuji tak trochu na predchozi thread. Jsem ted zmaten, jesli ma > > Object.finalize() smysl nebo by mel byt @Deprecated. Pokud ma smysl, > > tak kdy ho pouzit? > > > > V JDK 1.6 JavaDoc dokumentaci > > > http://java.sun.com/javase/6/docs/api/java/lang/Object.html#finalize%28%29 > > stoji: > > > > "For example, the finalize method for an object that represents an > > input/output connection might perform explicit I/O transactions to > > break the connection before the object is permanently discarded." > > > > Clanek ja Javaworld > > http://www.javaworld.com/javaworld/jw-06-1998/jw-06-techniques.html > > tez radi ve finalize() uvolnovat systemove zdroje, ale pouze jako > > "fallback mechanism". (Coz mi presne sedi pro ten java.awt.Window > > problem). > > > > Progrepoval jsem JDK 1.6 zdrojaky a SUN se k finalize() asi stavi > > ambivalentne: nekde ho pouziva, nekde ne. Priklady pouziti: > > java.util.zip.ZipFile - zavira IO stream > > java.io.FileInputStream + java.io.FileOutputStream : zaviraji file > > descriptory > > ... a dalsi > > > > Nejvice je onen ambivalentni pristup videt na ImageInputStreamImpl a > > FileImageOutputStream z baliku javax.imageio.stream: > > ImageInputStreamImpl ma finalize(), ktere v podstate jen nastavi > > priznak isClosed = true > > FileImageOutputStream je potomek ImageInputStreamImpl a prepisuje > > finalize(), ve kterem nedela nic. > > > > Dale jsem nasel treba zakomentovany finalize(), ktery puvodne zavitral > > IO stream, v com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl s > > poznamkou, ze "It affects the performance greatly in multi-thread > > environment. ". Tedy ZipFile vesele IO stream zavira ve finalize(), > > kdezto CoreDocumentImpl to ma zakomentovane. > > > > Diky > > Ondra Medek > > > >
