4

Javaでgetterメソッドとsetterメソッドを使用する理由について疑問に思っています。ゲッターとセッターを介してプライベートフィールドの値を読み取ったり変更したりできる場合は、それらを直接パブリックに変更してみませんか?ゲッターとセッターは合理的でなければならないことを私は知っていますが、それらをあきらめることができないという正解は何でしょうか?

4

5 に答える 5

6

いくつかの理由は次のとおりです。

  • 追加の制約とチェックを追加できます。たとえば、特定の整数属性が[10..20]の範囲内にある必要がある場合は、にチェックを簡単に追加しsetterて、属性に他の値が設定されていないことを確認できます。
  • のみを提供することにより、それらを「読み取り専用」にすることができgetterます。
  • セッターにソースブレークポイントを簡単に設定して、値がいつどこから変更されるかを確認できます。
  • ロギングを簡単に追加して、これまでに設定された値を追跡できます。

その他の理由については、@Aditiが提供するリンクの回答を参照してください。ゲッターとセッターを使用する理由

于 2013-02-21T13:30:08.063 に答える
2

追跡するのが最も難しい形式のバグの1つは、データ項目の値の予期しない不適切な変更です。

データが公開されている場合、変更を加えるコードはプログラムのどこにあってもかまいません。

プライベートの場合、変更を加えるコードは同じソースファイル(通常は同じクラス)にある必要があります。セッターを含め、コードを変更する可能性のあるすべてのコードを簡単に見つけてインストルメント化できます。

于 2013-02-21T13:31:05.453 に答える
2

これは、インターフェースを実装から分離し(1)、変更に備える(2)方法です。たぶん簡単な例が役立つでしょう。

(1)
firstNameとsecondNameを別々のフィールドに格納するクラスUserがあるとします。これで、fisrtNameとsecondNameを連結するメソッドgetFullNameを使用できますが、Userクラスを使用しているプログラマーは、firstNameとsecondNameが2つの別個のフィールドであることを知る必要はありません。

(2)
ここで、UserクラスfullNameを1つのフィールドに格納する必要があるため、Userクラスを変更するだけで、getFullNameメソッドのすべての呼び出しを変更する必要はありません。フィールドを直接使用していた場合。

于 2013-02-21T13:35:10.093 に答える
1

Javaクラスでのカプセル化を維持するために、フィールドをプライベートにすることをお勧めします。アプリケーション内の何も、実装の詳細であるクラスの「内部」を知る必要はありません。アクセスする必要があるのは、値を要求したりプロセスを実行したりするためのオブジェクトのメソッドだけです。

場合によっては、内部値の一部へのアクセスを別のクラスに許可したいことがあります。この場合、直接ではなく、ゲッターを介して実行することをお勧めします。このように、そのクラスのコントラクトやその実装の詳細(値を内部に格納する方法)を変更する必要がある場合、リファクタリングははるかに簡単になります。

また、ゲッター/セッターを使用するのが一般的なパターンであるため、これにより、外部のリーダーや同僚がコードを読みやすくなり、一部のサードパーティライブラリはそれらが存在することを期待しています。

于 2013-02-21T13:31:51.243 に答える
0

メンバー変数に直接アクセスする代わりに、ゲッターとセッターを使用することで、-データ検証を行うことができます。

例えば

public void setAge(){
  if(age < 0){
     //throw exception
  }
}
于 2013-02-21T13:32:18.337 に答える