封装以保持不变量
一个类有两个部分:接口和实现。
接口是类的公开功能。它的公共方法和变量是接口的一部分。
实现是类的内部工作。其他类不应该知道类的实现。
封装是指从该类的任何用户隐藏类的实现的做法。这允许类对其内部状态做出假设。
例如,将此类表示为 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 始终同步。如果类成员是公开的,则不能保证两个角度表示是相关的。