{
Olio jokuolio = new Olio();
...
}
vs.
{
Olio jokuolio = new Olio();
jokuolio = null;
}
Eli kun poistutaan siitä lohkosta missä olio on luotu niin osaako java siinä vaiheessa automaattisesti vähentää olioon olevia viittauksia vai pitääkö se eksplitiittisesti tehdä asettamalla sille arvoksi null? Siis, kannattaako muuttujia ikinä asettaa nulliksi, jos niitä ei aio enää käyttää?
Olio jokuolio = new Olio();
...
}
vs.
{
Olio jokuolio = new Olio();
jokuolio = null;
}
Eli kun poistutaan siitä lohkosta missä olio on luotu niin osaako java siinä vaiheessa automaattisesti vähentää olioon olevia viittauksia vai pitääkö se eksplitiittisesti tehdä asettamalla sille arvoksi null? Siis, kannattaako muuttujia ikinä asettaa nulliksi, jos niitä ei aio enää käyttää?
Vastaukset 1
Vanhimmat
Roskienkeruuhan poistaa ajoittain oliot, joihin ei ole enää viittauksia. En tunne JVM:n sielunelämää tarkemmin, mutta näin järjellä ajateltuna esittämäsi mallit ovat sen kannalta sinänsä (käytännössä) yhtäläisiä. Nimittäin lohkosta poistuttaessa instanssiin ei voi olla enää viittauksia ja se siis kerätään pois. Jälkimmäisessä asetat jokuolio-muuttujan viittaamaan nulliin, jolloin viittaus instanssin muistipaikkaan häipyy ja se voidaan kerätä pois.
Ehkä jos lohkossa jupeksitaan kauan, niin voi olla paikallaan laittaa muuttujaan viisaamaan nulliin, jolloin mahdollisesti lohkon suorituksen aikana aktivoituva roskienkeruu kerää sen pois. Muuten ei eroa kait ole.
Ovatko, btw, javassa muuttujat dynaamisesti allokoitavia muistialueita vai varataanko ne staattisesti jo ennen suoritusta? Tarkoitan tapausta "Olio jokuolio;", jossa muuttujaan ei aseteta mitään viittausta - poistetaanko tuo muuttuja lohkosta poistuttaessa roskienkeruun tapaan, vai onko se muistissa pysyvästi?
"Siis, kannattaako muuttujia ikinä asettaa nulliksi, jos niitä ei aio enää käyttää?"
Edelliset kommentit olivat roskienkeruun kannalta. Yleisesti ohjelmointikysymyksenä tuohon on vähän vaikeampi vastata. Ehkä se joissain yhteyksissä kannattaa, koska tällöin mahdolliset myöhemmät virheelliset viittaukset aiheuttaisivat selvästi havaittavan virheen eivätkä "epätoiminnallisuutta". En kuitenkaan yleisesti itse käyttäisi tuollaista menettelyä.