導入
getter だけでは値を読むことしかできません。外から書き換えたい場面もあります。そこで setter(setXxx())を用意しますが、ただ代入するだけでなく、「おかしい値」をその場で弾くチェック(バリデーション)を入れられるのが setter の強みです。
説明
setter の中に if 文で条件をチェックし、おかしい値は代入せずに拒否します。
public class Main {
public static void main(String[] args) {
BankAccount acc = new BankAccount(1000);
acc.setBalance(-100);
System.out.println(acc.getBalance());
}
}
class BankAccount {
private int balance;
BankAccount(int balance) {
this.balance = balance;
}
int getBalance() {
return balance;
}
void setBalance(int balance) {
if (balance >= 0) {
this.balance = balance;
} else {
System.out.println("残高は0以上にしてください");
}
}
}
setBalance(-100) を呼んでも、balance は書き換えられず、もとの 1000 のままです。「フィールドを直接いじらせず、必ずメソッドを経由させる」ことで、こういうチェックを一箇所にまとめられます。これがカプセル化の実用的な価値です。
やってみよう
下のエディタで setBalance にいろいろな値(正の数・負の数・0)を渡して実行し、残高がどう変化するか(または変化しないか)を確かめましょう。
演習
Fridge(冷蔵庫)クラスに private int temp を持たせ、コンストラクタで初期化してください。setTemp(int t) は、t が -30 〜 10 の範囲内なら設定し、範囲外なら 設定できません と表示するようにしてください。getTemp() で現在の温度を返せるようにし、main で Fridge f = new Fridge(4); f.setTemp(100); System.out.println(f.getTemp()); を実行してください。
ヒント1を見る
void setTemp(int t) { if (t >= -30 && t <= 10) { this.temp = t; } else { System.out.println("設定できません"); } }。
ヒント2を見る
getTemp() は return temp; するだけの単純なメソッドです。