
Javaのオブジェクト指向のカプセル化は、「しかるべき、クラスやメソッドからしかアクセスさせない」というプログラムの中でのアクセス制御の考え方です。
フィールド、メソッドに対するカプセル化
アクセス修飾子
Javaでは、下記のアクセス修飾子を「フィールド」や「メソッド」に付けることで、カプセル化を実現します。
アクセス修飾子 | 説明 |
---|---|
private | 自分自身のクラスからのみアクセス可能 |
何も書かない | 自分と同じパッケージからのみアクセス可能 |
protected | 自分と同じパッケージかつ、自分を継承したクラスからのみアクセス可能 |
public | 全てのクラスからアクセス可能 |
getter、setterメソッド
例えば、下記のように「本」をクラスとして見立てた「Bookクラス」があったとしたら、本の名前のフィールドには、privateをつけて、その本の名前を取得したり(getterメソッド)、設定したりするメソッド(setterメソッド)のみに、publicとします。
「gettName」メソッド経由でしかアクセスできませんし、本の名前をセットする場合は、「setName」経由でしか設定ができません。
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Book { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } |
getter、setterメソッドによるメリット
Read-Onlyなフィールドを作れる。
例えば、setterメソッドのみ外せば、外部から読み込みだけできて、書き込みが出来ないクラスというRead-Onlyなクラスを作ることができます。(普通のフィールドでは、アクセス修飾子を使って、書き込みも読み込みもどちらも出来ないという制御しかできませんからね。)
逆に、普通はあまり見かけないですが、Wrte-onlyなフィールドも作れたりしますね。
フィールドの名前の変更に強い
例えば、nameというフィールド名が、「bookName」に変えたいといった場合でも、フィールドの名前と、getter、setterメソッドの設定値だけ変えれば、他のクラスに影響を与えずに、名前の変更を行うことが可能です。
設定する値をチェックできる。
例えば、setterメソッドに下記のように記述することで、名前の設定前に設定内容のチェックを行うことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class Book { private String name; public String getName() { return name; } public void setName(String name) throws Exception { if (name == null) { throw new Exception("名前が設定されていない"); } this.name = name; } } |
なので、バグに強いシステムを作ることへも貢献してくれます。
クラスに対するカプセル化
フィールドやメソッドだけでなく、「クラス」に対してもカプセル化をかけることができます。
アクセス修飾子
アクセス修飾子 | 説明 |
---|---|
何も書かない(非public) | 自分と同じパッケージに属するクラスのみアクセス可能 |
public | 全てのクラスからアクセス可能 |
この記事へのコメントはありません。