Java — final
Le mot-clé final en Java est souvent mal compris. Pourtant, il est essentiel pour écrire du code plus fiable, plus lisible et éviter certaines erreurs fréquentes.
Idée simple
Le mot-clé final signifie :
une variable ne peut plus être réassignée après son initialisation
Mais attention :
cela ne veut PAS dire que l’objet est immuable
Cas 1 — Variable primitive
final int x = 10;
x = 20; // ❌ erreur de compilation
-
Ici :
-
xne peut plus changer - sa valeur est définitivement fixée
Cas 2 — Objet
final List<String> list = new ArrayList<>();
list.add("hello"); // ✔️ OK
list = new ArrayList<>(); // ❌ interdit
-
Ce qu’il faut comprendre :
-
on peut modifier le contenu de l’objet
- mais on ne peut pas changer la référence
En résumé :
- ✔️ modifier l’objet → autorisé
- ❌ changer l’objet → interdit
Résumé mental
Quand on utilise final sur une variable objet :
“Je ne peux pas pointer vers un autre objet” MAIS “je peux modifier l’objet lui-même”
Piège classique
Beaucoup pensent :
“final = immuable”
- Faux
final ≠ immutabilité
Comment rendre un objet immuable ?
Pour créer un objet réellement immuable :
- pas de setters
- tous les champs en
final - aucune modification interne
Exemple important
final StringBuilder sb = new StringBuilder("hello");
sb.append(" world"); // ✔️ OK
Ici :
sbest final- mais l’objet continue de changer
Cas d’une méthode
public void test(final int x) {
x = 5; // ❌ interdit
}
Un paramètre final :
- ne peut pas être modifié dans la méthode
Cas d’une classe
final class MyClass {
}
Résultat :
- impossible d’hériter de cette classe
Cas d’une méthode final
class A {
final void method() {}
}
Résultat :
- impossible de redéfinir (override) la méthode
Pourquoi c’est important
Dans des applications modernes (backend, systèmes concurrents, etc.) :
final permet de :
- éviter des erreurs de réassignation
- rendre le code plus clair
- limiter les effets de bord
- améliorer (partiellement) la sécurité en concurrence
Pièges fréquents
- croire que
finalrend un objet immuable - oublier qu’on peut modifier l’objet
- confondre avec
const(C/C++)
Questions classiques
Q1
final int x = 10;
x = 20;
Erreur de compilation
Q2
final List<String> list = new ArrayList<>();
list.add("test");
OK
Q3
final List<String> list = new ArrayList<>();
list = new ArrayList<>();
Erreur de compilation
Q4
final StringBuilder sb = new StringBuilder("a");
sb.append("b");
System.out.println(sb);
Affiche : "ab"
À retenir
finalbloque la réassignationfinalne garantit PAS l’immuabilité- c’est un outil simple mais puissant pour écrire du code plus sûr
En résumé
“final empêche de changer la référence, mais pas de modifier l’objet.”
Ce concept paraît simple, mais il fait souvent la différence entre un code fragile et un code robuste.