2011-02-09 17 views
1

私はC++とC#を使用している期間の後にJavaプロジェクトを作成しています。コンストラクタのフィールド初期化のベストプラクティスについては疑問があります。基本的に、単純なPointクラスがあるとします。 C++では、コンストラクタでの私のフィールドの初期設定は次のようになります... C#のでクラスコンストラクタのフィールド初期化:直接または "setter"を介して?

class Point { 
public: 
    // Default constructor 
    Point(double x, double y) : x(x), y(Y) { } 

protected: 
    // Coordinates 
    double x, y; 
}; 

Javaでは

class Point { 
    // Coordinates, with automatic properties 
    public double X { get; protected set; } 
    public double Y { get; protected set; } 

    // Default constructor 
    Point(double x, double y) { 
     X = x; 
     Y = y; 
    }  
} 

を...ベストプラクティスがでなければならないフィールドのgetter/setterを定義することをお勧め外部からアクセスする。しかし、クラス内からもそれらを使用することをお勧めします。この疑問は、Eclipseがクラスコード内の各コードをsetField(field)に変換するのが快適であるという事実から来ます。したがって、クラスコードの中から読み書きが行われても、getter/setterを持つフィールドのためです。(したがって、クラスインタフェース)。

これは基本的に、各アクセスに対して関数呼び出しを追加します。さて、フィールドの設定に他の操作(つまり、検証、処理など)が必要な場合を除いて、これは意味がありますか?常識的には、getters/settersの使用はC#プロパティの使用に似ていますが、ここではC#のという自動プロパティについては何も処理せずに基本アクセスしか含まないことに疑問を呈しています。だから問題は:getters/setterをクラスコードの中から追加の処理をしないで呼び出すことができますか?


Tunnuz

答えて

4

ゲッターセッターありがとう物事をカプセル化します。今日は処理することはありませんが、明日は何かを処理する必要があるかもしれません。 Getters Settersを使う方が良いです。

デフォルト値のinitilizationでは、Getters Settersを使用するように設定するときに何らかの処理がある場合はコンストラクタ\を使用できます。

ベスト・プラクティスは、その値にメンバフィールドをinitilizeする

  • コンストラクタ/ Initilizerブロックを使用することです。クラスのアクセスフィールド内から
  • 直接
  • 外のクラスを使用ゲッター/セッターから

私は「としても

+0

これがポイントです。 +1はより明確な答えです。 –

+0

"明日は少し早すぎる必要があるかもしれませんか?" – tunnuz

0

を参照してください。 ve getterとsetterをコンストラクタ内で使用する必要はなく、プログラムの速度を落とすための余分なメソッド呼び出しを作成するだけです。私はこのようなメソッド呼び出しは通常コンパイル時にインライン展開されるので、それがいかに重要であるかはわかりません。

2

私はまた、直接アクセスを希望します。しかし、内部的なセマンティクスが必要な場合には、簡単なget/setterのために使用したいかもしれません。

get/setterがtrivalではないことがあらかじめ分かっていない場合は、内部でも追加作業を実行する必要があるかどうかを事前に知っていない可能性があります。表示されるように有用です。

My Eclipse(Helios)のインストールではこの変換が行われないため、オフにすることができます。

1

設定する値に対して検証、書式設定、または処理を行う場合は、セッターの使用をお勧めします。

のは、あなたのFooクラスは常にセッターを使用しない場合、あなたが検証コードにあなたが値を設定するたびに書き換える必要があります、空でないバー値を持つ必要がある必要があるとしましょう:

public class Foo { 

    private String bar; 

    public Foo(String aValue) { 

     if(aValue==null || aValue.equals("")) { 
      throw new IllegalArgumentException("Duh"); 
     } 

     bar=aValue; 

    } 

    public void setBar(String aValue) { 

     if(aValue==null || aValue.equals("")) { 
      throw new IllegalArgumentException("Duh"); 
     } 

     bar=aValue; 

    } 
} 

setterを使用すると、コードを再利用して、1つのポイントでさらに多くのロジックを実装できます。

public class Foo { 

    private String bar; 

    public Foo(String aValue) { 

     setBar(aValue); 

    } 

    public void setBar(String aValue) { 

     if(aValue==null || aValue.equals("")) { 
      throw new IllegalArgumentException("Empty values not allowed"); 
     } 

     if(aValue.length()>24) { 
      throw new IllegalArgumentException("Too long"); 
     } 
     bar=aValue; 

    } 

} 
関連する問題