4

次のタイプのインスタンス化に違いはありますか? 変数が定義されている場所に値を直接設定するか、クラス コンストラクターで値を設定するか。

そうでない場合、ベストプラクティスは何ですか?

"クラスで":

class A {
    boolean b = true;

    public A(){
    }
}

「コンストラクター内」:

class B {
    boolean b;

    public B(){
        b = true;
    }
}

変数の型は単なる例です。私が見る唯一の違いは、属性が複合型 (クラス) である場合、どのコンストラクターが含まれているクラスのコンストラクターに与えられる値に依存するかということです。

class A {
    B b;
    public A(String s){
        b = new B(s);
    }
}
4

7 に答える 7

4

実際、どちらも同等です。ただし、読みやすさの観点からは、最初の方が読みやすいです。また、誰かが IDE から変数宣言に移動すると ( ctrlEclipse で + マウスをクリックするなど)、デフォルト値を簡単に確認できます。

公式チュートリアルの内容を確認してください-

これは、初期化値が使用可能で、初期化を 1 行に入れることができる場合にうまく機能します。ただし、この形式の初期化には、その単純さゆえに制限があります。初期化に何らかのロジックが必要な場合 (たとえば、エラー処理や複雑な配列を埋めるための for ループ)、単純な代入は不十分です。インスタンス変数はコンストラクターで初期化でき、エラー処理やその他のロジックを使用できます。クラス変数に同じ機能を提供するために、Java プログラミング言語には静的初期化ブロックが含まれています。

したがって、プロセスが単純な場合は、単純なワンライナー初期化手法を簡単に使用できます。複雑な初期化の選択については、コンストラクターが最適です。

于 2013-08-22T12:31:27.027 に答える
2

クラスの変数に値を割り当てると、クラスのインスタンスを作成するときに、目的の値が変数に直接割り当てられます。

コンストラクターで値を割り当てる場合、変数には最初にデフォルト値が割り当てられ、次にコンストラクターからの値が割り当てられます。

初期化ブロック、コンストラクター、およびそれらの実行順序を読み取る

ベストプラクティスの場合、

  • オブジェクトの作成中にすべての値をコストラクタに渡す必要がある場合は、構築の初期化を使用する必要があります。
  • すべてのオブジェクトに対してデフォルトにする必要がある値がいくつかある場合は、外部コンストラクターを割り当てることができます。
于 2013-08-22T12:29:36.250 に答える
1

初期化ブロックを使用します。 フィールドの初期化

public class X {

  // The following is the initializer block
  {
  }

  public X() {
  }
}
于 2013-08-22T12:34:31.293 に答える
0

どちらもほぼ同じです。

しかし、ドキュメントからの効果的な行

. インスタンス変数はコンストラクターで初期化でき、エラー処理やその他のロジックを使用できます。

于 2013-08-22T12:34:47.037 に答える
0

インスタンス フィールドの初期化は、コンパイラによってコンストラクタの先頭にコピーされるため、最初の 2 つの方法ではまったく同じコードが生成されます (または非常に近い)。

(ただし、静的フィールドの初期化とstaticイニシャライザ メソッドの場合、上記はまったく当てはまらないことに注意してください。)

それは主に、どちらがより明確で、混乱やエラーにつながる可能性が低いかという問題です。そして、それは個人的なスタイルを含む多くの要因に依存します.

于 2013-08-22T12:36:36.037 に答える
0

インスタンス変数には、割り当てない場合に備えてデフォルト値が割り当てられます! Bu デフォルトのブール型インスタンス変数には値 false が割り当てられます。

public class HelloWorld {

    boolean b;

    public void printData() {
        System.out.println("Defualt boolean value is " + b);
    }


   public static void main(String args[]) {
    HelloWorld hw = new HelloWorld();
    hw.printData();
    }
}

出力はDefualt boolean value is falseです。

変数をどこに割り当てるかは、純粋に設計上の選択です。

于 2013-08-22T12:29:10.133 に答える
-1

私はCをお勧めします:

class C {
    private boolean b = true;

}

-> (明示的な) コンストラクターがない -> コードが少ない -> 読みやすい

于 2013-08-22T12:31:00.380 に答える