封装以保持不变量

一个类有两个部分:接口和实现。

接口是类的公开功能。它的公共方法和变量是接口的一部分。

实现是类的内部工作。其他类不应该知道类的实现。

封装是指从该类的任何用户隐藏类的实现的做法。这允许类对其内部状态做出假设。

例如,将此类表示为 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(){}
}

该类依赖于基本假设(或不变量 ): angleInDegrees 和 angleInRadians 始终同步。如果类成员是公开的,则不能保证两个角度表示是相关的。