本文へスキップ
BecomeCoder

Javaオブジェクト指向コース · 第2章 カプセル化 ― データを守る仕組み · レッスン5

setter とバリデーション ― 不正な値を防ぐ

ブラウザで完結

導入

getter だけでは値を読むことしかできません。外から書き換えたい場面もあります。そこで settersetXxx())を用意しますが、ただ代入するだけでなく、「おかしい値」をその場で弾くチェック(バリデーション)を入れられるのが 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-3010 の範囲内なら設定し、範囲外なら 設定できません と表示するようにしてください。getTemp() で現在の温度を返せるようにし、mainFridge 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; するだけの単純なメソッドです。

実際に動かしてみよう

下のエディタにJavaを書いて「実行」を押すと、学習用シミュレータが System.out.println の出力を表示します(本物のJVMではなく、教材の範囲を再現した軽量エンジンです)。クラス・継承・コレクションなども動きます。Scanner で入力を読む例は「標準入力」欄に値を入れてください。本文の例を書き換えて動かしてみましょう(Stream・ラムダ・スレッド・ファイル入出力など一部の機能は対象外です)。

Java — ブラウザ内で実行(学習用シミュレータ)

Javaの教材サブセットを動かす学習用シミュレータを読み込みます(本物のJVMではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。