質問
単純な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());
}
}
解決
一般に、Javaプログラマーはゲッターメソッドの使用について非常に一貫している傾向があります。複数の言語をプログラムしていますが、一貫性がありません;)
ゲッターを作成しない限り、プライベート変数には生の変数を使用しても構いません。ゲッターを作成するときは、それだけを使用する必要があります。プライベートフィールドのゲッターを作成すると、IDEは、ゲッターを導入するときに自動的に生のフィールドアクセスを置き換えることを提案します。ゲッターを使用するように切り替えることは、キーストロークを数回押すだけで(エラーが発生する可能性もありません)、必要になるまで遅らせる傾向があります。
もちろん、getter-injection、hibernateのようないくつかのタイプのプロキシおよびサブクラス化framworksのようなものを使いたい場合は、getterを使用する必要があります!
他のヒント
ゲッターを使用すると、誤って変数を変更することはありません:)また、ゲッターと" raw"変数を使用すると、コードが混乱する可能性があります。
また、継承を使用し、子クラスでゲッターメソッドを再定義した場合、ゲッターを使用するメソッドは適切に機能しますが、生の変数を使用するメソッドは機能しません。
どこでもgetterメソッドを使用する場合-将来、getMessageId()のすべての呼び出しでコード検索を実行すると、それらのすべてが見つかりますが、プライベートな呼び出しを使用した場合は、いくつかを見逃す可能性があります。
また、setterメソッドに導入するロジックがある場合、複数の場所を変更することを心配する必要はありません。
プロパティに割り当てる値が既知の値または検証済みの値である場合、プライベート変数を直接安全に使用できます。 (おそらくそれがなぜ悪いのかが明らかな特別な状況を除いて。)あなたがそうするかどうかは、好みやスタイルの問題です。ゲッターまたはセッターは十分に単純な場合、コンパイラーによってインライン化されるため、パフォーマンスの問題でもありません。
値がクラスで不明な場合は、プロパティを使用して設定する必要があります。これにより、プロパティを不正な値から保護できます。
例を次に示します(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;
}
}
ゲッターを使用する場合、ロジック/決定が適用された後に値を取得することが保証されます。これはおそらくあなたの典型的な状況ではありませんが、そうなると、あなたはこれに感謝します。