これらの変数に単純にパブリック フィールドを使用するのではなく、取得と設定のみを行うゲッターとセッターを使用する利点は何ですか?
ゲッターとセッターが単純な get/set 以上の処理を行っている場合、これをすぐに理解できますが、その方法については 100% 明確ではありません。
public String foo;
以下よりも悪いものはありますか?
private String foo;
public void setFoo(String foo) { this.foo = foo; }
public String getFoo() { return foo; }
一方、前者では定型コードが大幅に少なくなります。
ベストアンサー1
実際には、クラスのフィールドを直接公開するのではなく、アクセサの使用を検討する理由は、カプセル化や将来の変更を容易にするといった理由以外にも数多くあります。
私が認識している理由のいくつかは次のとおりです。
- プロパティの取得または設定に関連する動作のカプセル化 - これにより、後で追加の機能 (検証など) を簡単に追加できるようになります。
- 代替表現を使用してプロパティを公開しながら、プロパティの内部表現を非表示にします。
- パブリック インターフェイスを変更から保護します。実装が変更されても、既存のコンシューマーに影響を与えることなく、パブリック インターフェイスを一定に保つことができます。
- プロパティの有効期間とメモリ管理 (破棄) セマンティクスを制御します。これは、管理されていないメモリ環境 (C++ や Objective-C など) では特に重要です。
- 実行時にプロパティが変更された場合のデバッグ インターセプション ポイントを提供します。一部の言語では、これがないと、プロパティが特定の値に変更された時期と場所をデバッグすることが非常に困難になる可能性があります。
- プロパティのゲッター/セッターに対して動作するように設計されたライブラリとの相互運用性が向上しました。モック、シリアル化、WPF などが思い浮かびます。
- 継承者がゲッター/セッター メソッドをオーバーライドすることで、プロパティの動作と公開方法のセマンティクスを変更できるようにします。
- ゲッター/セッターを値ではなくラムダ式として渡すことを可能にします。
- ゲッターとセッターは異なるアクセス レベルを許可できます。たとえば、get はパブリックですが、set は保護されている可能性があります。