たとえば、フィールドがありますint x
。Javaは、宣言時にフィールドを初期化することを好みますか
int x = 0;
むしろコンストラクタで?
public foo() {
x = 0;
}
デザインの観点からどちらがより好ましいですか?
たとえば、フィールドがありますint x
。Javaは、宣言時にフィールドを初期化することを好みますか
int x = 0;
むしろコンストラクタで?
public foo() {
x = 0;
}
デザインの観点からどちらがより好ましいですか?
何が起こるかを知っている限り、どちらも良いです。
それらが初期化される順序は次のとおりです。
public int x = 0;
:)this.x = 0;
:)ただし、整数をゼロに初期化することはできません。Javaはこれを自動的に行います。
初期化の順序を無視するエラーを示す小さなデモ:
class Foo
{
public String str;
public String strTwo = "Here is str: " + str;
public Foo()
{
str = "Java";
System.out.println(strTwo);
}
}
これは印刷されますHere is str: null
。
プリミティブ型のインスタンス変数は暗黙的に初期化されますが、参照変数にはnull値が割り当てられます。
したがって、::のように割り当てる場合
int x=0;
すべてのオブジェクトでx=0になります。
ただし、コンストラクターの場合は、異なるコンストラクターで異なる値を使用して初期化できますが、異なるコンストラクターで異なる値を使用して初期化することはお勧めできません。
Javaは、フィールドが宣言されたとき、またはコンストラクターで初期化されることを好みますか?
デフォルト値で初期化する場合、コンストラクターまたは宣言時に初期化するのは冗長です。
ただし、デフォルト値とは異なる値で初期化する場合は、デラレーションよりもコンストラクターを使用する必要があります。
設計の観点からどちらがより好ましいですか?
デザインの観点からは、まったく違いはありません。実装の詳細です。
私の好みは、コンストラクターの外部でデフォルト値を初期化することです
int x=0;
複数のコンストラクターと多くのインスタンス変数がある場合、初期化を忘れないようにします。変数に特定の値が必要な場合は、コンストラクターで再初期化します。
私が思い出す限り、両方のインスタンスでコンパイラによって生成されるバイトコードはほとんど同じであり、実際には好みとコーディング スタイルの問題です。個人的には、コンストラクターで変数を初期化することを好む傾向があります - コンストラクターで変数を初期化する必要がある場合 (コンストラクターに引数を渡す場合など) は、理解するために 1 か所を見ればよいことを意味します。 2ではなく、何が起こっているのか。
(補足として、あなたの例では、「int x;」を定義すると自動的に0に設定されるため、「int x = 0」を実行する必要はありません。)
public foo() { x = 0; }
これは良いでしょう。この int x =0 を使用すると、すべてのオブジェクトが対象になります。ただし、コンストラクター表記は、その特定のコンストラクターによって作成されるオブジェクト用です。