オブジェクト指向のこころ その3
カプセル化
第8章に記述されているオブジェクト指向の三大要素の一つであるカプセル化に対する考え方についてです。
カプセル化とはフィールド変数のアクセス修飾子をprivateにして他のクラスから見えなくすること、のような説明が多くあると思います。
この本ではカプセル化をこのようなデータ隠蔽だけでなく、実装、サブクラス、設計、インスタンス生成方法の隠蔽も含むものと捉えるべきと述べています。抽象クラスやインターフェイスを用いることで実装クラスに関する情報を隠蔽することができます。
ArrayListクラスを使うときに、下のコードのようにListインターフェイスを使用することが多いと思います。僕も今までとりあえずこのようにコードを書いていました。上記のカプセル化の記述を読んだ後で考えてみると、この場合BookShelfクラスからはフィールド変数bookTitleListの型はListに見えます。ListインターフェイスによってArrayListクラスという実装クラスが隠蔽されています。隠蔽されているためにArrayListをLinkedListという別のListインターフェイスの実装クラスに変更する場合も new ArrayList()→ new LinkedList()にするだけですみます。
また、addメソッドがどのように実装されているかもBookeShelfクラスは知る必要はありません。実装が隠蔽されているからです。なので、addメソッドのコードを変更したとしてもBookShelfクラスを変更する必要はありません。
// 本棚を表すクラス
public class BookShelf {
// 本棚に格納されている本のタイトルのリスト
private List<String> bookTitleList = new ArrayList();
public void addBookTitle(String bookTitle) {
bookTitleList.add(bookTitle);
}
}
インターフェイスに対する理解が少し進んだ気がします。