1. ホーム
  2. java

[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?

2022-03-15 10:11:06

質問

これらの変数に単純にパブリック・フィールドを使用する代わりに、取得と設定のみを行うゲッターとセッターを使用する利点は何でしょうか?

もしゲッターとセッターが単純なget/set以上のことをすることがあれば、私はすぐにこれを理解することができますが、どのようにすればよいのか100%明確ではありません。

public String foo;

が少しでも悪いと

private String foo;
public void setFoo(String foo) { this.foo = foo; }
public String getFoo() { return foo; }

一方、前者は定型的なコードが少なくて済みます。

解決方法は?

実際にあるのは 多くの正当な理由 アクセサを使用することを検討する クラスのフィールドを直接公開するよりも、カプセル化の議論や将来の変更のしやすさだけでなく。

以下は、私が認識している理由の一部です。

  • プロパティの取得または設定に関連する動作のカプセル化 - これは、追加機能(検証など)をより簡単に後で追加することを可能にします。
  • プロパティの内部表現を隠し、別の表現を使ってプロパティを公開する。
  • パブリック・インターフェースを変更から隔離する - 既存のコンシューマに影響を与えることなく、実装が変更されてもパブリック・インターフェースを一定に保つことができるようにする。
  • プロパティの寿命とメモリ管理(廃棄)セマンティクスの制御 - 非管理型メモリ環境(C++やObjective-Cなど)では特に重要です。
  • 実行時にプロパティが変更されたときのデバッグ用インターセプトポイントを提供する - プロパティがいつ、どこで特定の値に変更されたかをデバッグすることは、言語によってはこれがないと非常に困難である。
  • プロパティ・ゲッター/セッターに対して操作するように設計されたライブラリとの相互運用性を向上させました - モッキング、シリアライゼーション、WPFが思い浮かびます。
  • ゲッター/セッターメソッドをオーバーライドすることで、継承者がプロパティの動作と公開方法のセマンティクスを変更できるようにします。
  • ゲッター/セッターを値ではなくラムダ式で渡せるようにする。
  • ゲッターとセッターは、異なるアクセスレベルを許可することができます。例えば、ゲットはパブリックですが、セットはプロテクトされている可能性があります。