本文へスキップ
BecomeCoder

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

private フィールドと getter ― 読み取り専用の公開

ブラウザで完結

導入

前回の問題を防ぐ第一歩は、フィールドを外から直接触れないように「隠す」ことです。Javaでは private というアクセス修飾子を使います。

説明

フィールドに private をつけると、そのフィールドは同じクラスの中からしかアクセスできなくなります。外部から読み取りたい場合は、値を返すだけの専用メソッド(gettergetXxx() という名前が慣習)を用意します。

public class Main {
    public static void main(String[] args) {
        BankAccount acc = new BankAccount(1000);
        System.out.println(acc.getBalance());
    }
}

class BankAccount {
    private int balance;

    BankAccount(int balance) {
        this.balance = balance;
    }

    int getBalance() {
        return balance;
    }
}
  • private int balance;balance はこの BankAccount クラスの中だけで扱えるフィールドになります。
  • int getBalance() { return balance; } … 外部に値を「見せる」ための専用メソッド。読み取り専用にしたいときは、getter だけ用意してsetter(書き込み用メソッド)は用意しません。

この学習用シミュレータでは private をつけても直接アクセスをエラーにはしませんが、本物のJavaでは acc.balance のようにクラスの外から private フィールドへ直接アクセスしようとすると コンパイルエラー になります。だからこそ「外から触れる手段は getter だけ」という状態を安全に作れるのです。

やってみよう

下のエディタで BankAccount の残高を変えて実行し、getBalance() 経由でしか値を取り出せないことを確認しましょう。コンストラクタの引数を変えて別の残高で試してみてください。

演習

Student クラスに private String name フィールドを持たせ、コンストラクタで初期化してください。getName() というgetterメソッドを用意し、mainnew Student("はな") を作って getName() の結果を表示してください。

ヒント1を見る

private String name; と書き、Student(String name) { this.name = name; } というコンストラクタを用意します。

ヒント2を見る

String getName() { return name; } というgetterを書き、System.out.println(s.getName()); で表示します。

実際に動かしてみよう

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

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

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