web-dev-qa-db-ja.com

インスタンス初期化子はコンストラクターとどう違うのですか?

つまり、インスタンス初期化子が必要なのはなぜですか?コンストラクターよりもインスタンス初期化子を作成する場合、どのような違いまたは利点がありますか?

71
Ajay

これはそれをうまく説明しているようです:

インスタンス初期化子は、次の場合はいつでもインスタンス変数初期化子の便利な代替手段です。

  • 初期化コードは例外をキャッチする必要がある、または

  • インスタンス変数初期化子では表現できない空想的な計算を実行します。 もちろん、いつでもそのようなコードをコンストラクタで書くことができます。

しかし、複数のコンストラクターを持つクラスでは、各コンストラクターでコードを繰り返す必要があります。インスタンス初期化子を使用すると、コードを1回記述するだけで、オブジェクトの作成にどのコンストラクターを使用しても実行されます。インスタンス初期化子は、コンストラクターをまったく宣言できない匿名内部クラスでも役立ちます。

From:JavaWorld Javaでのオブジェクトの初期化

100
javamonkey79

オブジェクトのライフサイクルに関しては、違いはありません。どちらも構築時に呼び出され、論理的には初期化ブロックは構築の一部と見なすことができます。

意味的に、イニシャライザは、いくつかの理由により、便利なツールです。

初期化子は、初期化される変数の隣に初期化ロジックを保持することにより、コードを読みやすくすることができます。

   public class Universe {
       public int theAnswer;
       {
         int SIX = 6;
         int NINE = 7;
         theAnswer = SIX * NINE;
       }

       // a bunch of other vars
   }

   public class Universe {
       public int theAnswer;

       // a bunch of other vars

       public Universe() {
         int SIX = 6;
         int NINE = 7;
         theAnswer = SIX * NINE;

         // other constructor logic
       }
   }

イニシャライザは、使用されるコンストラクタに関係なく呼び出されます。

初期化子は匿名の内部クラスで使用できますが、コンストラクターでは使用できません。

20
ykaganovich

多くのコンストラクターがあり、各コンストラクターに対していくつかの共通コードを実行する場合は、インスタンス初期化子を使用できます。すべてのコンストラクターに対して呼び出されます。

8
Rahul Garg

匿名の内部クラスを使用すると、コンストラクターに対するインスタンス初期化子の本当の利点がわかります

匿名内部クラスはコンストラクターを持つことができません(匿名であるため)soそれらはかなり自然な適合ですインスタンス初期化子

4
padippist

インスタンス初期化子のイディオムは一般的に避けます。変数初期化子よりも優れている唯一の利点は、例外処理です。

また、initメソッド(コンストラクターから呼び出し可能)も例外処理を実行でき、コンストラクターセットアップコードを一元化できますが、コンストラクターパラメーター値を操作できるという利点があるため、インスタンス初期化子は冗長であるため、避けた。

4
CPerkins

イニシャライザは、コンストラクタ間でコードを共有する方法であり、イニシャライザが変数宣言で使用されている場合、コードを読みやすくします。

Javaコンパイラは、初期化子ブロックをすべてのコンストラクタにコピーします。したがって、このアプローチを使用して、複数のコンストラクタ間でコードのブロックを共有できます。 Oracleドキュメント

0
dnyanesh