Java オブジェクト指向1(カプセル化)
はじめに
Javaのオブジェクト指向を実現する上で重要となる3つの機能(カプセル化、継承、多態性)について3回にわたってご紹介します。 今回ご紹介する機能は、カプセル化です。
カプセル化
カプセル化とは、情報(データ)と操作(実装)を隠蔽することです。
ゲームのコントローラを操作する際、「○ボタンを押した場合、コントローラ内部でどのような処理が行われるか」ではなく、「○ボタンを押すことで、どのような操作ができるか」を意識することでしょう。
つまり、使い方(操作)が分かっていれば、内部処理を意識せずに使えるということが、カプセル化されているということです。
カプセル化のメリット
- 予期せぬバグを防げる 故意や間違いによるメンバ(フィールド及びメソッド)の利用を防止する
- プログラムの拡張が容易になる
- プログラムの構造が整理される 機能をAPIとしてクラス単位で提供できる
アクセス制御
1.アクセス修飾子
Javaでは、各メンバやクラスに対してアクセス修飾子を設定する(アクセス制御)ことで、カプセル化を行います。
《アクセス制御(メンバに対して)》
- フィールドへのアクセス制御 アクセス修飾子 データ型 変数名;
- メソッドへのアクセス制御 アクセス修飾子 メソッド宣言{…}
【アクセス修飾子】
制限 | 名前 | プログラム内の アクセス修飾子 |
アクセスの許可範囲 |
厳しい
⇔ 緩い |
private | private | 自分自身のクラスのみ |
package private | (何も記述しない) | 自分と同じパッケージ内のクラス | |
protected | protected | 自分と同じパッケージ内 or 自分を継承したクラス | |
public | public | 全クラス |
フィールドはprivate、メソッドはpublicとするのが一般的です。
《アクセス制御(クラスに対して)》
- クラスへのアクセス制御 アクセス修飾子 クラス宣言{…}
【アクセス修飾子】
制限 | 名前 | プログラム内の アクセス修飾子 |
アクセスの許可範囲 |
厳しい | package private | (何も記述しない) | 自分と同じパッケージ内のクラス |
緩い | public | public | 全クラス |
非publicクラスのみ許される特徴
- クラス名はソースファイルと異なってよい
- 1つのソースファイルに複数宣言してよい
つまり、「1つのソースファイルに1つのpublicクラス」となり、「ファイル名 = publicクラス名」としなければならないということです。
2.getter / setter
IntroductionクラスでElementクラスのフィールドには、private修飾子がついているため、アクセスできません。
しかし、XXXメソッドやYYYメソッドについては、public修飾子がついているためアクセスできます。
つまり、フィールドへのアクセスは、メソッド経由で行うということです。
2種類のメソッドを使って、フィールドへアクセスします。 それが、getterメソッドとsetterメソッドです。
《getterメソッド》
ある特定のフィールドから値を取得したい場合に使用します。
public フィールドの型 getフィールド名(){
return this.フィールド名;
}
return this.フィールド名;
}
//getterメソッド使用例
public String getName(){
return ths.name;
}
public String getAge(){
return ths.age;
}
public String getName(){
return ths.name;
}
public String getAge(){
return ths.age;
}
《setterメソッド》
ある特定のフィールドに値を設定したい場合に使用します。
public void setフィールド名(フィールドの型 任意の変数名){
this.フィールド名 = 任意の変数名;
}
this.フィールド名 = 任意の変数名;
}
//setterメソッド使用例
public void setName(String name){
this.name = name;
}
public void setAge(String age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
public void setAge(String age){
this.age = age;
}
getter / setterのメリット
- Read Only、Write Onlyのフィールドを実現できる
- クラスの内部設計を自由に変更できる フィールド名を変更しても、getXXXメソッドやsetXXXメソッドを呼び出している他のクラスには影響がない
- フィールドに異常値が設定されていないか検査できる 設定されようとしている値が妥当かどうか検査することは、プログラミングでは一般的
まとめ
「カプセル化」についてご紹介しました。 お役に立てると幸いです。