[ karas @ 23.08.2003. 13:49 ] @
Bruce Eckel savetuje da sve zavrshne radnje nekog objekta izvedem u finally bloku. Zar nije bilo lakshe tvorcima Jave da omogucce destruktor ili barem da garantuju izvrshavanje finalize() odmah po bacanju objekta u smecce?
[ t3chX @ 23.08.2003. 17:12 ] @
Bruce Eckel je napisao i da finalize() nije uvek uspesna metoda, pa prema tome ostaje ti da se uzdas u stari dobri GC (koji je fenomenalno odradjen u Javi).
Razlog za destruktor ??? Zasto uvoditi desktruktore kada se cak i C++ populacija trudi da ih sto manje upotrebljava uvodjenjem externih garbage collectora...

[ Dragi Tata @ 23.08.2003. 22:55 ] @
Destruktori u GC jezicima nemaju baš mnogo smisla. Kad će da se pozove taj destruktor?

Citat:
Zasto uvoditi desktruktore kada se cak i C++ populacija trudi da ih sto manje upotrebljava uvodjenjem externih garbage collectora...


Ovo te je neko slagao. Većina mehanizama za automatsko upravljanje memorijom u C++u se upravo oslanja na destruktore.
[ -zombie- @ 24.08.2003. 02:35 ] @
Citat:
karas:
Bruce Eckel savetuje da sve zavrshne radnje nekog objekta izvedem u finally bloku. Zar nije bilo lakshe tvorcima Jave da omogucce destruktor ili barem da garantuju izvrshavanje finalize() odmah po bacanju objekta u smecce?


pa.. nije to baš tako jednostavno kako ti zamišljaš.. ti nikad objekte ne bacaš u smeće.. pre će biti da ti oni "ispadaju" po ulici dok trčiš, a posle prolazi đubrar i skuplja ih ;))

fazon je što GC nije garantovana i predefinisana operacija. ti nikad ne možeš da predvidiš kada će neki objekat biti oslobođen, pa čak ni kojim redom, itd..


ako te stvarno zanima teorija iza ove problematike, (i usput imaš šira interesovanja od same jave), evo dva vrlo korisna texta o GC i finalizerima u .NET (znam da nije striktno za ovaj forum -- ali to sam skoro čitao pa sam se setio...)

prvi je više o Delphi .NET implementaciji, a drugi je čisto m$, ali ipak prilično kvalitetan ;) -- principi rada svega ovoga (teorija, iza kulisa) zajednički su sa implementacijom javinih virtuelnih mašina, pa stoji moja preporuka svima!!


http://community.borland.com/article/0,1410,29365,00.html

http://msdn.microsoft.com/msdnmag/issues/1100/GCI/default.aspx
http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/GCI2.asp (drugi deo)
[ t3chX @ 24.08.2003. 10:42 ] @
Da istina ... ali da li ti mehanizmi nastoje da olaksaju programeru u onoj meri u kojoj on ne bi trebao explicitno da navodi ~Klasa() ?

[ caboom @ 24.08.2003. 11:03 ] @
glede gc-a, mali offtopic:
http://www.kraml.at/stupid/java2k.html
have fun :)
[ Dragi Tata @ 24.08.2003. 17:51 ] @
Citat:
t3chX:
Da istina ... ali da li ti mehanizmi nastoje da olaksaju programeru u onoj meri u kojoj on ne bi trebao explicitno da navodi ~Klasa() ?


Mislim da je generalna rasprava na temu automatskog upravljanja memorijom (iliti "garbage collection") primerenija forumu Art of Programming i ako si zainteresovan, otvori novu temu tamo pa ćemo da "ćaskamo" o tome.

Uglavnom što se Jave tiče, ostaje činjenica da njen gc ne omogućava determinističku finalizaciju objekata i zato destruktori u Javi nemaju smisla. Recimo, autori C#-a su uveli funkciju koja ima sintaksu destruktora, ali je u stvari finalizator baš kao u Javi. To je po meni loše, jer navodi nekog sa C++ iskustvom da misli da su u pitanju pravi destruktori, što jednostavno nije tačno. Mislim da je rešenje sa Javom bolje, jer ne uvodi takvu zabunu.
[ karas @ 24.08.2003. 17:54 ] @

Ako u konstruktoru otvorim fajlove zar ne bi bilo lepo da ih zatvaram u finalize() a ne da to obavljam iz finally bloka ili chekam na GC da pozove finalize()?
[ Dragi Tata @ 24.08.2003. 18:41 ] @
Naravno da bi bilo lepo. Ta tehnika se zove Resource Acquisition Is Initialisation ili skraćeno RAII i možeš o njoj više da pogledaš npr ovde:

http://www.spin.ie/jon/raii/

Citat:

"RAII cannot generally be used with languages that clean up objects using an unpredictable garbage collection, such as Java."