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
>

Odpovedet emailem