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).