K používání každého objektu si máte přečíst jeho dokumentaci – když to neuděláte, je jen vaše chyba, když ten objekt dělá něco jiného, než byste čekal. Navíc na chování funkce setVisible() není nic zákeřného, ona opravdu dělá přesně to, co má v názvu. To, že vy si myslíte, že když okno nevidíte, tak neexistuje, to není problém té metody, Swingu, ale pouze vašeho pohledu. Ostatně okno také nejprve vytvoříte konstruktorem a pak jej zviditelníte voláním setVisible() – už jen z toho by vás mělo trknout, že existence okna a jeho viditelnost jsou dvě různé věci.
GC je od toho, aby z paměti odstranil objekty, které už se nepoužívají. Pořád je ale starostí programátora to, aby zrušil odkazy na objekty, které už nechce používat. Java nemá žádný magický mechanizmus, kterým by určovala, že programátor už asi nechce používat okno, když ho skryl a miliony dalších podobných heuristik, ale používá jednoduché řešení – objekt se používá, dokud na něj jsou odkazy. I v aplikacích s GC jde vyrobit memory leaky, a to právě tak, že programátor zapomene uvolnit některé odkazy i když už objekt nepoužívá. Nesmíte zapomínat na to, že při konstrukci objektu nezískáváte odkaz na objekt jenom vy jako výsledek volání konstruktoru, ale objekt sám má na sebe odkaz přes this. A tenhle odkaz může předat někam dál. Takhle se chovají komponenty, vlákna, spousta posluchačů událostí si drží pevné reference na objekty, na kterých naslouchají… Je zbytečné se nad tím rozčilovat, takhle to prostě je a nedá se říci, zda by bylo lepší řešení bez pevných odkazů – někdy ano, jindy je lepší model s pevnými odkazy. Takže je potřeba si opravdu nastudovat alespoň základy toho, jak s konkrétními objekty zacházet, když je chcete začít používat. finalize() neřeší nic, protože jediné, co je garantováno, je že finalize() nebude na konkrétním objektu spuštěno více než jednou. To ale znamená, že může být spuštěno jednou a nebo také vůbec. S pozdravem Filip Jirsák 2010/1/26 Ondra Medek <xmed...@gmail.com> > K cemu je potom GC a cely ten tezkotonazni aparat? > > Pro reseni uklidu toho Window IMHO staci WeakReference a propadne > finalize() a je to. > > 2010/1/26 Ladislav Thon <ladi...@gmail.com>: > >> Tak objekt v pameti furt visi. To nepovazuji za stastne reseni. Priste > >> abych u kazde tridy louskal manual, jestli nahodou nema specialni > >> metodu, kterou musim volat, nez objekt prestanu pouzivat. > > > > To ovšem musíte stejně. Na finalizér se nemůžete spoléhat, nikdo vám > > nezaručí, že vůbec někdy bude zavolán. Uklízet po sobě je slušnost nejen > > doma v obejváku :-) > > > > LT > > > > > > -- > Ondra Medek >