Notes sur les handles



Les handles servent a "referencer" un objet. Par analogie avec les pointeurs utilises en C/C++, on peut dire qu'un handle "pointe" vers un objet.

Il y a d'ailleurs de tres nombreuses analogies (sur le fond et sur la forme) entre les handles de JAVA et les pointeurs du C++. Toutefois, de par leur nature, les handles de JAVA sont differents des pointeurs du C++.

Considerons le programme suivant:

  public class handle
  {
    public static void main (String[] argv)
    {
      // on declare deux handles
      Test handle_1;
      Test handle_2;

      // on instancie deux objets
      // handle_1 pointe vers le premier objet
      // handle_2 pointe vers le deuxieme objet
      handle_1 = new Test(1);
      handle_2 = new Test(2);

      System.out.println("\nPremier test:\n");
      handle_1.Afficher_Valeur();
      handle_2.Afficher_Valeur();
    
      handle_1 = handle_2;
      handle_2.Set_Valeur(3);
    
      System.out.println("\nDeuxieme test:\n");
      handle_1.Afficher_Valeur();
      handle_2.Afficher_Valeur();
    }
  }

  class Test
  {
    int i;

    Test (int val) { i = val; }
   
    void Afficher_Valeur()
    {
      System.out.println(i);
    }
  
    void Set_Valeur(int val) { i = val; }
  }
  
A l'execution ce programme affiche:

  Premier test:
  1
  2
  Deuxieme test:
  3
  3
  

Entre l'affichage des tests 1 et 2, il y a les lignes:

  ...
  handle_1 = handle_2;
  handle_2.Set_Valeur(3);
  ...
  
La premiere ligne peut etre traduite par:

Le handle "handle_1" pointe sur l'objet reference par "handle_2". Autrement dit, les handles "handle_1" et "handle_2" pointent vers le meme objet.

Que devient l'objet anciennement pointe par "handle_1" ?

Il n'est plus reference, par consequent il n'est plus accessible. Le garbage collector