Depuis une très longue période, le mot-clé const est marqué réservé par dans de nombreux éditeurs IDE Java, tels qu'Eclipse, qui le colorie comme un mot-clé réservé du langage même s'il en interdit l'emploi dans le même temps.

Le mot-clé const a un sens différent de final.

Car si final appliqué à une variable ou variable membre protège une référence et interdit à son pointeur de désigner autre chose que cette variable, const est supposer protéger effectivement cette variable contre des modifications par, entre-autres, des fonctions membres modificatrices.


C'est ainsi que dans ce code d'exemple, pourvu d'un mot-clé final, ce mot-clé ne protège pas le contenu de la variable sur laquelle il s'applique. Et par là, je trouve son usage d'un intérêt limité.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
/** Une personne. */
class Personne
{
/** Le nom de la personne. */
private String m_szNom;
 
   /** Construire une personne qui a un nom. */
   public Personne(String szNom) {setNom(szNom);}
 
   /** Renvoyer le nom de la personne. */
   public String getNom() {return(m_szNom);}
 
   /** Fixer le nom de la personne. */
   public void setNom(String szNom) {m_szNom = szNom;};
}
 
/** Un programme d'essai. */
public class Essai
{
/** Un monsieur 'final'. */
private final Personne monsieur = new Personne("Remulus");
 
   /** Un essai qui montre que final ne protège pas le contenu du monsieur. */
   public void unEssai()
   {
      System.out.println("Avant: " + monsieur.getNom());
      monsieur.setNom("Rébus");
      System.out.println("Après: " + monsieur.getNom());
   }
 
   /** Lancement de l'essai. */
   public static void main(String[] args)
   {
      new Essai().unEssai();
      System.exit(0);
   }
}
A l'exécution:
C:\build\classes>java -cp . Essai
Avant: Remulus
Après: Rébus

(en revanche, dans mon code source, je n'aurais pas pu écrire ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
   public void unEssai()
   {
      System.out.println("Avant: " + monsieur.getNom());
      monsieur.setNom("Rébus");
      System.out.println("Après: " + monsieur.getNom());
      monsieur = new Personne("Charade");
   }
car j'aurais cherché à changer l'affectation du pointeur monsieur).


Alors, bien entendu, il existe le pattern immutable. Mais il pose un problème: il n'offre pas de garantie.

Je peux par principe vous présenter une classe nommée TotoImmutable, et malheureusement, soit par oubli, soit par erreur, elle ne l'est pas réellement...

Seul un mot-clé const, je crois, permettrait d'être réellement rassuré.
Qu'en est-il de sa venue? Est-elle prévue?