Zdravím,
se swingem už jsem dlouho nepracoval, ale jestli se správně pamatuju, tak princip rušení grafických komponent je velice podobný tomu v SWT, takže se můj názor odvíjí od tohoto. Okno, stejně jako většina komponent je nativní systémový resource, tedy něco, co je třeba po sobě manuálně uklidit. Je to podle mě stejný případ jako například inputstream, akorát místo file handlerů vznikají v systému window handlery, tedy něco co se "samo" určitě neuklidí. Spoléhat v tomto případě na finalize() mi přijde asi stejně zcestné jako spoléhat na to, že se sám uklidí file handler po input streamu (to, že opravdu zůstanou viset si asi většina z nás bolestně ověřila). 2 Ondra Medek: To že se občas dispose() nevolalo je spíš problém nedostatečného testování a disciplíny developerů než špatného návrhu Swing API. Navíc mi vzhledem k tomu, že na okně voláte setVisible(false) místo dispose je asi špatné použití metody setVisible, jak už někdo zmínil dříve, protože pokud na té samé instanci komponenty potom zavoláte setVisible(true) měla by se nezměněná objevit, což si dost dobře nedovedu představit, pokud by proběhl úklid resourců. Vytvoření dvou sad metod, jedna pro "běžné developery" a jedna pro experty, se mi zdá jako koncept, který by přinesl spíše chaos než jednoduchost, protože si dost dobře dovedu představit situaci, kdy půlka developerů té samé aplikace používá expertní rozhraní a ta druhá spoléha na to, že se uklízí samo. Výsledkem by byly ty samé chyby, které by se daleko hůř hledaly. Přenášet odpovědnost na GC nedává moc smysl už z podstaty GC, která spočívá v tom, že "si běhá kdy se mu zachce" a tím pádem narozdíl od c++ finalizerů je naprosto nevhodný pro tyto úlohy. Což já osobně považuji za jednu z pro mě nejoblíbenějších specifikací Javy.

S pozdravem

______________________
Lukáš Záruba (Lukas Zaruba)
Chief Technical Officer
MEDIA SOLUTIONS EUROPE
Lisabonská 4
Praha 9 190 00
Czech Republic



Ondra Medek napsal(a):
Tak potom melo to uvolneni zdroju byt jako default v setVisible(false)
nebo aspon jako default close operace.

Podle mne by to melo byt nastaveno tak, aby se vse uklizelo pri
nejjednodusim pouziti. Pokud uklizeni zdrzuje, tak pak se mohou
vytvorit metody pro experty, ktere uklizet nebudou.

Prave opravuji aplikaci, kde je cca 50 dialogu, 10 frames. Vetsinou se
dispose() volalo, nekdy take ne, na default close operaci se vetsinou
zapomnelo ...

2010/1/26 Ladislav Thon <[email protected]>:
GC slouží k automatické správě _paměti_ a jenom paměti. Byly sice snahy
napasovat to i na ostatní zdroje (ve Swingu se nevyznám, ale třeba JDBC je
ukázkový příklad), ale ukázalo se, že je s tím víc problémů než užitku
(deadlocky v JDBC driverech).

Možná, že ve Swingu to lze nějak bezpečně zařídit, ale obecně je spoléhání
se na finalizéry při uvolňování zdrojů Špatné (TM).

Odpovedet emailem