Java Language Encapsulation pour maintenir les invariants


Exemple

Il y a deux parties d'une classe: l'interface et l'implémentation.

L'interface est la fonctionnalité exposée de la classe. Ses méthodes publiques et ses variables font partie de l'interface.

L'implémentation est le fonctionnement interne d'une classe. Les autres classes ne devraient pas avoir besoin de connaître l'implémentation d'une classe.

L'encapsulation fait référence à la pratique consistant à cacher l'implémentation d'une classe à tous les utilisateurs de cette classe. Cela permet à la classe de formuler des hypothèses sur son état interne.

Par exemple, prenez cette classe représentant un angle:

public class Angle {
    
    private double angleInDegrees;
    private double angleInRadians;
    
    public static Angle angleFromDegrees(double degrees){
        Angle a = new Angle();
        a.angleInDegrees = degrees;
        a.angleInRadians = Math.PI*degrees/180;
        return a;
    }
    
    public static Angle angleFromRadians(double radians){
        Angle a = new Angle();
        a.angleInRadians = radians;
        a.angleInDegrees = radians*180/Math.PI;
        return a;
    }
    
    public double getDegrees(){
        return angleInDegrees;
    }
    
    public double getRadians(){
        return angleInRadians;
    }
    
    public void setDegrees(double degrees){
        this.angleInDegrees = degrees;
        this.angleInRadians = Math.PI*degrees/180;
    }
    
    public void setRadians(double radians){
        this.angleInRadians = radians;
        this.angleInDegrees = radians*180/Math.PI;
    }
    private Angle(){}
}

Cette classe repose sur une hypothèse de base (ou invariant ): angleInDegrees et angleInRadians sont toujours synchronisés . Si les membres de la classe étaient publics, il n'y aurait aucune garantie que les deux représentations des angles soient corrélées.