Aller au contenu

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 :

  • x ne 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 :

  • sb est 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 final rend 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

  • final bloque la réassignation
  • final ne 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.