カプセル化はオブジェクト指向プログラミングの重要な概念の一つです。本日はそれに関する問題を取り上げます。
問題
次のコードは対話的にユーザーの情報を管理するプログラムです。あるフィールドに対して直接的なアクセスを防ぐために、どのように修正すべきでしょうか?
public class User {
String name;
int age;
void displayInfo() {
System.out.println("Name: " + name + ", Age: " + age);
}
}
選択肢
- A. 名前と年齢のフィールドをpublicにする
- B. 名前と年齢のフィールドをprivateにし、それに対応するgetterとsetterを作成する
- C. displayInfoメソッドをupdateInfoに名前変更し、フィールドをprotectedにする
- D. 特に修正の必要はない
答えと解説
回答を見る
答え
B. 名前と年齢のフィールドをprivateにし、それに対応するgetterとsetterを作成する
解説
基本説明:
Javaにおいて、カプセル化はクラスのフィールドを外部から隠蔽することを指します。これは、データの直接的な改変を防ぎ、データをより安全に扱うための手法です。
フィールドをprivateに設定すると、クラス外部からそれらのアクセスが制限され、データの整合性が保たれます。それと同時に、getterとsetterを通じてデータのアクセスと修正を可能にします。
この方法は、データ操作に対する制御を増やし、不正や誤ったデータが渡されるのを防ぐのに役立ちます。
誤答理由:
Aを選んだ場合:
フィールドをpublicにすると、外部から直接アクセスされ、誤ったデータがクラスにセットされる可能性があります。これはカプセル化の目的に反します。
Cを選んだ場合:
フィールドをprotectedにしても限定的ですが、同一パッケージまたはサブクラスからのアクセスが可能です。getter/setterを提供する方が適切です。
Dを選んだ場合:
現状ではカプセル化の原則が守られていないため、修正が必要です。
つまずきポイント:
初心者がよくつまずくのは、フィールドをpublicにするか、getter/setterを使用するか、または他の可視性修飾子(protected, package-private)を選ぶことです。この選択は開発上の目的や要件に依存するため、理解を深めていくことが重要です。
getter/setterはコードの見通しが悪くなるように思われるかもしれませんが、長期的な考え方としてはデータの整合性や安全性を確保する重要な手法です。
発展知識:
カプセル化は、public
, protected
, private
そして package-private
などの可視性修飾子を理解することから始まります。これらはメンバ変数やメソッドのアクセス制限を決めるための重要な要素です。
さらに、Javaのクラス設計において、インタフェースや抽象クラスを組み合わせることで、より柔軟な設計が可能になります。カプセル化はそれらと組み合わせて、変更に強い設計を作ることができます。