変数をカプセル化する最も簡単と思われる例を上げてみます。
以下のコードは、身長を保持(設定/取得)するためのクラスです。
public class Tall() {
private double tall; //カプセルかされた変数
public Tall() {
}
public getCentimeters() {
return tall / 10;
}
public getMillimeters() {
return tall;
}
public getFeets() {
return tall / 304.8;
}
public setCentimeters( double tall ) {
this.tall = tall * 10;
}
public setMillimeters( double tall ) {
this.tall = tall;
}
public setFeets( double tall ) {
this.tall = tall * 304.8;
}
}
内部的には、身長はミリメートル単位で保持されていますが
内部状態を全く意識することなく、フィートで設定して、
センチメートルで取り出すといったことが可能になります。
これが、ひとつの利点です。
また、身長が負の値になったりすることはありえませんが、
tallの double型変数がパブリックで宣言されていると、
tall = -170 といった非現実的な値も設定できてしまいます。
しかし、前記のコードのsetCentimeter()メソッドを
public setCentimeters( double tall ) {
if( tall < 0 ) throw new Error();
this.tall = tall * 10;
}
という風に適当なエラーを送出するように設定することで
不自然な値自体を設定できないようにすることが可能になります。
これが、ふたつめの利点です。