Masquage d'informations
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy — leçon 12 sur 87.
La dissimulation d'informations est le principe consistant à restreindre l'accès direct aux données internes d'un objet. En combinant les champs private avec des getters et des setters, vous créez une barrière protectrice autour de l'état de votre objet.
Considérez ce qui se passe sans masquage d'informations :
public class Temperature {
public double celsius; // Exposé directement
}
// N'importe qui peut définir des valeurs invalides
Temperature t = new Temperature();
t.celsius = -500; // En dessous du zéro absolu - impossible !Avec le masquage d'informations, vous contrôlez la manière dont les données sont consultées et modifiées :
public class Temperature {
private double celsius;
public void setCelsius(double celsius) {
if (celsius >= -273.15) {
this.celsius = celsius;
}
}
public double getCelsius() {
return celsius;
}
}Désormais, les températures invalides sont rejetées automatiquement. La représentation interne est masquée — vous pourriez plus tard modifier la manière dont la température est stockée en interne (peut-être en Kelvin) sans affecter le code qui utilise la classe.
Cette approche offre trois avantages clés : la validation garantit l'intégrité des données, la flexibilité permet des modifications internes sans casser le code externe, et le contrôle vous permet de décider exactement quelles opérations sont autorisées sur vos données.
Défi
FacileConstruisons une classe de gestion Password qui démontre la dissimulation d'informations en protégeant les données sensibles et en appliquant des règles de sécurité via un accès contrôlé.
Vous allez créer deux fichiers pour organiser votre code :
Password.java: Créez une classe Password qui cache ses données internes et contrôle la manière dont les mots de passe peuvent être définis et consultés :- Un champ privé
password(String) qui stocke le mot de passe réel - Un champ privé
minLength(int) qui définit la longueur minimale acceptable du mot de passe - Un constructeur qui prend en paramètre l'exigence de longueur minimale
- Un setter
setPassword(String password)qui n'accepte que les mots de passe respectant la longueur minimale requise. S'il est valide, stockez-le et retourneztrue; s'il est trop court, ne modifiez pas le mot de passe et retournezfalse - Un getter
getMaskedPassword()qui retourne le mot de passe avec tous les caractères remplacés par des astérisques (*) - n'exposez jamais le mot de passe réel ! - Une méthode
checkPassword(String attempt)qui retournetruesi la tentative correspond au mot de passe stocké,falsesinon - Un getter
getLength()qui retourne la longueur du mot de passe actuel (ou 0 si aucun mot de passe n'est défini)
- Un champ privé
Main.java: Créez un objet Password avec une longueur minimale de 6, puis lisez deux entrées : un mot de passe à définir et une tentative à vérifier. Affichez trois lignes :Set: trueouSet: false(résultat de la définition du mot de passe)Masked: ******(la version masquée du mot de passe)Match: trueouMatch: false(résultat de la vérification de la tentative)
Vous recevrez deux entrées : le mot de passe à définir, et la tentative de mot de passe à vérifier.
Remarquez comment le mot de passe réel n'est jamais directement accessible depuis l'extérieur de la classe - c'est la dissimulation d'informations en action. La classe contrôle exactement quelles informations sont révélées et comment le mot de passe peut être modifié.
Aide-mémoire
La dissimulation d'informations (information hiding) restreint l'accès direct aux données internes d'un objet en utilisant des champs private combinés à des accesseurs (getters) et des mutateurs (setters).
Sans dissimulation d'informations, les champs sont exposés et peuvent être définis avec des valeurs invalides :
public class Temperature {
public double celsius; // Exposé directement
}
Temperature t = new Temperature();
t.celsius = -500; // Valeur invalide autoriséeAvec la dissimulation d'informations, vous contrôlez l'accès et validez les données :
public class Temperature {
private double celsius;
public void setCelsius(double celsius) {
if (celsius >= -273.15) {
this.celsius = celsius;
}
}
public double getCelsius() {
return celsius;
}
}Principaux avantages de la dissimulation d'informations :
- Validation : Assure l'intégrité des données en rejetant les valeurs invalides
- Flexibilité : Permet des modifications internes sans affecter le code externe
- Contrôle : Vous permet de décider quelles opérations sont autorisées sur vos données
Essayez vous-même
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Lire le mot de passe à définir
String passwordToSet = scanner.nextLine();
// Lire la tentative de mot de passe à vérifier
String passwordAttempt = scanner.nextLine();
// TODO: Créer un objet Password avec une longueur minimale de 6
// TODO: Définir le mot de passe et afficher le résultat ("Set: true" ou "Set: false")
// TODO: Afficher le mot de passe masqué ("Masked: ******")
// TODO: Vérifier la tentative de mot de passe et afficher le résultat ("Match: true" ou "Match: false")
}
}
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érateur