wiki:k2014/demo/vinkkeja9
Last modified 4 years ago Last modified on 2014-03-16 16:24:39

Demot » Demo 9, Vinkkeja

Pöytätesti ja roskaksi muuttuminen

Olio muuttuu roskaksi sitten, kun siihen ei ole enää yhtään viitettä. Eli jos esim. pöytätestissä on olio esim. N3 (eli 3. newllä luotu olio), niin sitten kun missään muuttujassa ei enää ole &N3 (viittausta olioon 3), niin tuo olio muuttuu roskaksi.

Aliohjelman lokaalin muuttujan häviäminen (vaikutusalueen, scope) loppuminen ei ole roskaksi muuttumista.

Esim:

   public static String liitaYksikko(String s) {
      return s + " m";
   }

Tuossa lokaali muuttuja s lakkaa olemasta kun aliohjelmasta lähdetään pois. Mutta ei sanota, että s muuttuu roskaksi. Riippuen siitä, onko joku toinen viite joka jossakin muualla osoittaa samaan paikkaan, kuin mihin s osoitti (viittasi) aliohjelmaan tullessa, voi s:n viittaama olio muuttua roskaksi tai olla muuttumatta. Tätä ei voi nähdä yksin aliohjelmaa katsomalla.

Seuraavassa olisi selkeä roskaksi muuttuminan

   public static String yhdista(String s1, String s2) {
      StringBuilder sb = new StringBuidler(); // N1
      sb.append(s1);
      sb.append(s2);
      return sb.toString();  // N1 muuttuu roskaksi
   }

lokaali muuttuja sb lakkaa olemasta kun aliohjelmasta lähdetään pois (sb.toString() luo uuden olion, jos olisi palautettu sb, niin silloin se ei olisi vielä muuttunut roskaksi). Eli kun sb lakkaa olemasta, niin kukaan ei enää viittaa tuohon olioon joka luotiin rivillä new StringBuilder(); ja nimenomaan tämä olio muuttuu roskaksi.

   public static StringBuilder yhdista(String s1, String s2) {
      StringBuilder sb = new StringBuidler(); // N1
      sb.append(s1);
      sb.append(" ");
      sb.append(s2);
      return sb; // N1 ei vielä muutu roskaksi
   }

Oikealla tavalla kutsuttuna:

  StringBuilder tulos = yhdista("kissa","istuu");
  ...

N1 jäisi "elämään", koska tulos viittaisi siihen.

Jos em. aliohjelmaa kutsuttaisiin:

  yhdista("kissa","istuu");

Roskaksi voi muuttua myös mikäli viite käännetään toiseen paikkaan:

      StringBuilder sb = new StringBuidler();  // N1
      sb = new StringBuidler(); // sb viittaa N2:een,  N1 muuttuu roskaksi

N1, joka luotiin ekaksi pysyi hengissä sen ansiosta että sb siihen vähän aikaa viittaa. Mutta kun luodaan N2 ja sb "käännetään" viittaamaan siihen, niin silloin kukaan ei enää viittaa N1:een ja se muuttuu roskaksi.

Samoin roskaksi voi muuttua myös mikäli viite "nollataan":

      StringBuilder sb = new StringBuidler();  // N1
      sb = null; // N1 muuttuu roskaksi

Tiedostot