スッキリわかるJava入門 第10章 カプセル化②
第10章 カプセル化②
publicやpackage privateを利用する
- 勇者は戦うのが仕事なので、いろいろなクラスからattack()メソッドが呼び出される可能性がある。
- どのようなクラスからでも呼び出せるようにpublic指定を付けておく。
- sleep()メソッドにはpublicを付けない。この場合package privateを指定したと見なされ、同じパッケージに属するクラスからの呼び出しのみ可能となる。
public class Hero { // 省略 void sleep() { // 省略 } public void attack(Matango m){ // 省略 }
メンバに関するアクセス修飾の定石
- フィールドはすべてprivate
- メソッドはすべてpublic
- クラスはすべてpublic(メンバではないが、クラスの定石)
- 基本はこのパターンに沿ってアクセス修飾を行い、その後クラス内部だけで利用するメソッドのみをprivateに指定し直すような「微調整」をすればよい。
getterとsetter メソッドを経由したフィールド操作
- 基本的にフィールドは、メソッド経由でアクセスする
- 他のクラスの開発者がバグを含んだコードを書いても、勇者のHPをマイナス100にする事は不可能。
- HPに異常な値が設定される不具合に直面しても、そのときはメソッド(attack(),sleep())どちらかのバグという事が想定できる。
単純にフィールド値を取り出すだけのメソッド
- 王様クラスが勇者クラスの名前を知るには?
- HeroクラスにgetNameメソッドを追加して、王様が勇者の名前を知ることができるようにする。
public class Hero { private String name; public String getName(){ return this.name; } }
- Kingクラスでは、nameフィールドにアクセスしている部分を、getName()を呼び出すように修正する。
public class King { void talk(Hero h) { System.out.println("王様:ようこそ我が国へ、勇者" + h.getName() + "よ。"); } }
getterメソッドの書き方
getterメソッドの書き方の定石
// 定石 public 値を取り出すフィールドの型 getフィールド名(){ return this.フィールド名; } // サンプル public String getName(){ return this.name; } }
メソッド名の慣習的なルール
- メソッド名の最初の3文字を「get」にし、それに続けて「フィールド名の先頭を大文字にしたもの」にする。
- フィールド名がnameならgetName()となる。
- 例外として戻り値がboolean型の場合のみisXxxx()というメソッド名にすることがある。
- このメソッド名の付け方はJava開発者の間で常識になっている風習みたいなもの。