19

単純な get/set プロパティを持つクラスがある場合、クラス メソッド内でゲッターを使用する理由はありますか?それとも、プライベート メンバー変数を使用する必要がありますか? セッター(検証ロジック?)についてはもっと議論があると思いますが、ゲッターについてだけ疑問に思っています。

たとえば (Java の場合) - オプション 2 を使用する理由はありますか?:

public class Something
{
    private int messageId;
    public int getMessageId() { return this.messageId; }
    public void setMessage(int messageId) { this.messageId = messageId; }

    public void doSomething()
    {
        // Option 1:
        doSomethingWithMessageId(messageId);

        // Option 2:
        doSomethingWithMessageId(getMessageId());
    }
}
4

6 に答える 6

9

一般に、Java プログラマーは getter メソッドの使用に関して非常に一貫性がある傾向があります。私は複数の言語をプログラムしていますが、一貫性がありません ;)

ゲッターを作成しない限り、未加工の変数をプライベート変数に使用しても問題ないと思います。ゲッターを作成するときは、それのみを使用する必要があります。プライベート フィールドのゲッターを作成すると、IDE は、ゲッターを導入すると raw フィールド アクセスを自動的に置き換えることを提案します。ゲッターの使用への切り替えは、キーを数回押すだけで (しかもエラーが発生する可能性はありません)、必要になるまで先延ばしにする傾向があります。

もちろん、getter インジェクション、いくつかのタイプのプロキシおよび休止状態のようなフレームワークのサブクラス化などを行いたい場合は、getter を使用する必要があります。

于 2009-03-10T06:01:50.833 に答える
7

ゲッターを使用すると、誤って変数を変更することはありません:) また、ゲッターと「生の」変数の両方を使用すると、コードが混乱する可能性があります。

また、継承を使用し、子クラスで getter メソッドを再定義した場合、getter を使用するメソッドは適切に機能しますが、raw 変数を使用するメソッドは機能しません。

于 2009-03-10T05:35:44.780 に答える
3

どこでも getter メソッドを使用し、将来的に getMessageId() のすべての呼び出しでコード検索を実行すると、それらすべてを見つけることができますが、プライベートなものを使用していた場合は、一部を見逃す可能性があります。

また、setter メソッドに導入するロジックがある場合でも、複数の場所を変更することを心配する必要はありません。

于 2009-03-10T05:38:38.453 に答える
1

プロパティに割り当てる値が既知の値または検証済みの値である場合は、プライベート変数を直接安全に使用できます。(おそらく、それが悪い理由が明らかな特別な状況を除いて。)あなたがそうするかどうかは、好みやスタイルの問題です. ゲッターまたはセッターが十分に単純である場合、コンパイラによってインライン化されるため、パフォーマンスの問題でもありません。

クラスで値が不明な場合は、プロパティを使用して値を設定し、不正な値からプロパティを保護する必要があります。

以下に例を示します (C# の場合):

public class Something {

   private string _value;

   public string Value {
      get {
         return _value;
      }
      set {
         if (value == null) throw new ArgumentNullException();
         _value = value;
      }
   }

   public Something() {
      // using a known value
      _value = "undefined";
   }

   public Something(string initValue) {
      // using an unknown value
      Value = initValue;
   }

}
于 2009-03-10T07:20:32.517 に答える
0

ゲッターを使用すると、ロジック/決定が適用された後に値を取得できるようになります。これはおそらくあなたの典型的な状況ではありませんが、そうである場合は、これに感謝します.

于 2009-03-10T07:23:37.080 に答える