Menu
Coddy logo textTech

Le mot-clé final

Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy — leçon 13 sur 87.

Le mot-clé final en Java empêche toute modification. Il peut être appliqué aux variables, aux méthodes et aux classes, chacune ayant un effet différent.

Lorsqu'il est appliqué à une variable, final en fait une constante - une fois assignée, sa valeur ne peut plus changer :

public class Circle {
    private final double PI = 3.14159;
    private final double radius;
    
    public Circle(double radius) {
        this.radius = radius;  // Peut être assignée une fois dans le constructeur
    }
    
    public void setRadius(double r) {
        // this.radius = r;  // Erreur ! Impossible de réassigner une variable final
    }
}

Une variable final doit être initialisée soit lors de la déclaration, soit dans le constructeur. Après cela, toute tentative de réassignation provoque une erreur de compilation.

Pour les types de référence, final signifie que la référence ne peut pas pointer vers un objet différent, mais le contenu de l'objet peut toujours changer :

private final StringBuilder name = new StringBuilder("John");

// name = new StringBuilder("Jane");  // Erreur ! Impossible de réassigner
name.append(" Doe");  // OK ! Le contenu de l'objet peut changer

L'utilisation de final avec des champs communique clairement l'intention : cela indique aux autres développeurs que cette valeur ne devrait jamais changer après l'initialisation. C'est particulièrement utile pour les valeurs de configuration, les identifiants ou toute donnée qui doit rester constante tout au long de la durée de vie d'un objet.

challenge icon

Défi

Facile

Construisons un système d'inscription Student qui utilise le mot-clé final pour protéger les données qui ne devraient jamais changer après l'inscription d'un étudiant.

Vous allez créer deux fichiers pour organiser votre code :

  • Student.java : Créez une classe Student où certaines informations sont verrouillées de manière permanente une fois définies :
    • Un champ final studentId (String) - attribué à la création et ne peut jamais changer
    • Un champ final enrollmentYear (int) - l'année où l'étudiant s'est inscrit, également permanente
    • Un champ privé régulier name (String) - peut être mis à jour si l'étudiant change de nom
    • Un constructeur qui prend les trois valeurs et initialise les champs
    • Un getter getStudentId() pour l'ID de l'étudiant
    • Un getter getEnrollmentYear() pour l'année d'inscription
    • Un getter getName() et un setter setName() pour le nom
    • Une méthode getInfo() qui retourne : "ID: [studentId] | Name: [name] | Enrolled: [enrollmentYear]"
  • Main.java : Créez un objet Student, puis mettez à jour son nom et affichez ses informations. Vous recevrez quatre entrées : l'ID de l'étudiant, le nom initial, l'année d'inscription et un nouveau nom pour la mise à jour. Affichez deux lignes :
    • Les informations de l'étudiant avant le changement de nom
    • Les informations de l'étudiant après le changement de nom

Vous recevrez quatre entrées dans l'ordre : studentId (String), name (String), enrollmentYear (int), et newName (String).

Remarquez comment les champs final protègent l'ID et l'année d'inscription de l'étudiant - ce sont des enregistrements permanents qui ne devraient pas changer, tandis que le nom peut être mis à jour via son setter.

Aide-mémoire

Le mot-clé final empêche toute modification en Java. Il peut être appliqué aux variables, aux méthodes et aux classes.

Lorsqu'il est appliqué à une variable, final en fait une constante - une fois assignée, sa valeur ne peut plus changer :

public class Circle {
    private final double PI = 3.14159;
    private final double radius;
    
    public Circle(double radius) {
        this.radius = radius;  // Peut être assigné une fois dans le constructeur
    }
    
    public void setRadius(double r) {
        // this.radius = r;  // Erreur ! Impossible de réassigner une variable final
    }
}

Une variable final doit être initialisée soit lors de sa déclaration, soit dans le constructeur. Après cela, toute tentative de réassignation provoque une erreur de compilation.

Pour les types de référence, final signifie que la référence ne peut pas pointer vers un objet différent, mais le contenu de l'objet peut toujours changer :

private final StringBuilder name = new StringBuilder("John");

// name = new StringBuilder("Jane");  // Erreur ! Impossible de réassigner
name.append(" Doe");  // OK ! Le contenu de l'objet peut changer

L'utilisation de final avec des champs communique une intention - cela indique qu'une valeur ne devrait jamais changer après l'initialisation, ce qui est utile pour les valeurs de configuration, les identifiants ou les données constantes.

Essayez vous-même

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Lire les entrées
        String studentId = scanner.nextLine();
        String name = scanner.nextLine();
        int enrollmentYear = scanner.nextInt();
        scanner.nextLine(); // consommer le saut de ligne
        String newName = scanner.nextLine();
        
        // TODO: Créer un objet Student avec les valeurs initiales
        
        // TODO: Afficher les informations de l'étudiant avant le changement de nom
        
        // TODO: Mettre à jour le nom de l'étudiant en utilisant le setter
        
        // TODO: Afficher les informations de l'étudiant après le changement de nom
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet