Swing a uvolnovani Window

Lukáš Záruba lukas.zaruba na media-solutions.cz
Úterý Leden 26 18:46:19 CET 2010


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 <ladicek na gmail.com>:
>   
>> 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).
>>
>>     



Další informace o konferenci Konference