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 les modifications. Il peut s’appliquer aux variables, aux méthodes et aux classes, avec un effet différent dans chaque cas.
Appliqué à une variable, final en fait une constante : une fois sa valeur assignée, celle-ci 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 affectée une fois dans le constructeur
}
public void setRadius(double r) {
// this.radius = r; // Erreur ! Impossible de réaffecter 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 lui réassigner une valeur provoque une erreur de compilation.
Pour les types référence, final signifie que la référence ne peut pas désigner un autre objet, mais que le contenu de l’objet peut quand même changer :
private final StringBuilder name = new StringBuilder("John");
// name = new StringBuilder("Jane"); // Erreur ! Impossible de réaffecter
name.append(" Doe"); // OK ! Le contenu de l’objet peut changerUtiliser final avec des champs exprime clairement l’intention : cela indique aux autres développeurs que cette valeur ne doit jamais changer après son initialisation. C’est particulièrement utile pour les valeurs de configuration, les identifiants ou toute donnée qui doit rester constante pendant toute la durée de vie d’un objet.
Une final méthode ne peut pas être redéfinie dans une sous-classe :
class Base {
public final void greet() {
System.out.println("Hi");
}
}
class Child extends Base {
// public void greet() { } // Erreur ! greet() est final dans Base
}Une classe final ne peut pas être étendue. String est une classe finale, donc aucune classe ne peut l’étendre :
final class Config { }
// class MyConfig extends Config { } // Erreur ! Config est finalDéfi
FacileConstruisons un système d’inscription des Student qui utilise le mot-clé final pour protéger les données qui ne doivent jamais changer après l’inscription d’un étudiant.
Tu vas créer deux fichiers pour organiser ton code :
Student.java: crée une classe Student dans laquelle certaines informations sont définitivement verrouillées une fois définies :- Un champ
finalstudentId(String) : attribué à la création et qui ne peut jamais changer - Un champ
finalenrollmentYear(int) : l’année d’inscription de l’étudiant, également définitive - Un champ privé ordinaire
name(String) : peut être mis à jour si l’étudiant change de nom - Un constructeur qui prend les trois valeurs et initialise les champs
- Un accesseur
getStudentId()pour l’identifiant de l’étudiant - Un accesseur
getEnrollmentYear()pour l’année d’inscription - Un accesseur
getName()et un mutateursetName()pour le nom - Une méthode
getInfo()qui renvoie :"ID: [studentId] | Name: [name] | Enrolled: [enrollmentYear]"
- Un champ
Main.java: crée un objet Student, puis mets à jour son nom et affiche ses informations. Tu recevras quatre entrées : l’identifiant de l’étudiant, le nom initial, l’année d’inscription et le nouveau nom à utiliser. Affiche deux lignes :- Les informations de l’étudiant avant le changement de nom
- Les informations de l’étudiant après le changement de nom
Tu recevras quatre entrées dans l’ordre suivant : studentId (String), name (String), enrollmentYear (int) et newName (String).
Remarque comme les champs final protègent l’identifiant de l’étudiant et son année d’inscription : ces informations sont définitives et ne doivent pas changer, tandis que le nom peut être mis à jour à l’aide de son mutateur.
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 à l’aide du setter
// TODO: Afficher les informations de l’étudiant après le changement de nom
}
}
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
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesChamps (Attributs)Méthode constructeurSurcharge de constructeurRécapitulatif - Calculatrice simple4Héritage
Héritage de base (extends)Le mot-clé superRedéfinition de méthode (@Override)Chaînage de constructeursLa classe ObjectHéritage simple et multiniveauPourquoi pas d'héritage multiple de classesRécapitulatif - Hiérarchie des employés7Méthodes spéciales et classe Object
Méthode toString()equals() et hashCode()Méthode clone()compareTo() et ComparableInterface ComparatorRécapitulatif - Tri personnalisé2Modificateurs d'accès et Encapsulation
Aperçu des niveaux d'accèsMéthodes Getter et SetterMasquage d'informationsLe mot-clé finalRécapitulatif - Gestionnaire de compte bancaire5Polymorphisme
Bases de la surcharge de méthodesRedéfinition de méthodes (Run-Time)Upcasting et DowncastingL'opérateur instanceofClasses et méthodes abstraitesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageAgrégation vs CompositionClasses internes, imbriquées et anonymesEnums et méthodes d'EnumRecords (Java 16+)Classes scellées (Java 17+)11Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron MonteurPatron ObservateurPatron Stratégie3Propriétés de classe et membres statiques
Variables d'instance vs variables statiquesMéthodes statiquesBlocs statiquesConstantes (static final)Récapitulatif - Compteur et utilitaire6Interfaces et Classes Abstraites
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesDefault et Static dans les InterfacesClasses Abstraites vs InterfacesInterfaces FonctionnellesRécapitulatif - Système de Paiement9La généricité
Introduction à la généricitéClasses génériquesMéthodes génériquesParamètres de type bornésWildcards (?, extends, super)Récapitulatif - Conteneur générique12Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositePatron ItérateurEntraînez-vous par vous-même : Compilateur Java en ligne