導入
前回の問題を防ぐ第一歩は、フィールドを外から直接触れないように「隠す」ことです。Javaでは private というアクセス修飾子を使います。
説明
フィールドに private をつけると、そのフィールドは同じクラスの中からしかアクセスできなくなります。外部から読み取りたい場合は、値を返すだけの専用メソッド(getter、getXxx() という名前が慣習)を用意します。
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メソッドを用意し、main で new Student("はな") を作って getName() の結果を表示してください。
ヒント1を見る
private String name; と書き、Student(String name) { this.name = name; } というコンストラクタを用意します。
ヒント2を見る
String getName() { return name; } というgetterを書き、System.out.println(s.getName()); で表示します。