パパの勉強部屋

勉強の記録をつけています。Java、ネットワーク、Excel、etc.

スッキリわかる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開発者の間で常識になっている風習みたいなもの。

単純にフィールドに値を代入するだけのメソッド

  • getメソッドとは逆で、フィールドに指定された値を単に代入するだけのメソッドは、setter(セッター)メソッドと言う。
setterメソッドの書き方の定石
// 定石
public void setフィールド名(フィールド名の型 任意の変数名){
	this.フィールド名 = 任意の変数名;
}

// サンプル
public void setName(String name) {
	this.name = name;
}
}