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é.
A l'exécution:
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); } }
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:
car j'aurais cherché à changer l'affectation du pointeur monsieur).
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"); }
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?
Partager