L'apparition du mot-clé const est-il prévu dans une version à venir du JDK?
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:
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:
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?