言い換えれば、なぜインスタンス初期化子が必要なのですか? コンストラクタよりもインスタンス初期化子を書くことには、どのような違いや利点がありますか?
7 に答える
これはそれをうまく説明しているようです:
インスタンス初期化子は、次の場合にインスタンス変数初期化子に代わる便利な方法です。
初期化子コードは例外をキャッチする必要があります。または
インスタンス変数初期化子では表現できない複雑な計算を実行します。もちろん、そのようなコードはいつでもコンストラクターで記述できます。
ただし、複数のコンストラクターを持つクラスでは、各コンストラクターでコードを繰り返す必要があります。インスタンス初期化子を使用すると、コードを 1 回記述するだけで、オブジェクトの作成に使用されたコンストラクターに関係なく実行されます。インスタンス初期化子は、コンストラクターをまったく宣言できない匿名の内部クラスでも役立ちます。
From: JavaWorld Java でのオブジェクトの初期化。
オブジェクトのライフサイクルに関しては、違いはありません。どちらも構築時に呼び出され、論理的に初期化ブロックは構築の一部と見なすことができます。
意味的に、イニシャライザはいくつかの理由から持っていると便利なツールです:
初期化子は、初期化される変数の隣に初期化ロジックを保持することで、コードの可読性を向上させることができます。
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
}
}
どのコンストラクターが使用されているかに関係なく、初期化子が呼び出されます。
初期化子は、コンストラクターが使用できない匿名の内部クラスで使用できます。
多くのコンストラクターがあり、コンストラクターごとにいくつかの共通コードを実行したい場合は、すべてのコンストラクターに対して呼び出されるインスタンス初期化子を使用できます。
一般に、インスタンス初期化子のイディオムは避けます。変数初期化子よりも優れているのは、例外処理だけです。
また、init メソッド (コンストラクターから呼び出し可能) も例外処理を行うことができ、コンストラクターのセットアップ コードを集中化することもできますが、コンストラクターのパラメーター値を操作できるという利点があるため、インスタンス初期化子は冗長であると言えます。避けた。
コンストラクターに対するインスタンス初期化子の本当の利点は、匿名内部クラスを使用するときに見られます。
匿名内部クラスは (匿名であるため) コンストラクターを持つことができないため 、インスタンス初期化子に非常に自然に適合します。
イニシャライザは、コンストラクタ間でコードを共有する方法であり、イニシャライザを変数宣言で使用すると、コードが読みやすくなります。
Java コンパイラは、イニシャライザ ブロックをすべてのコンストラクタにコピーします。したがって、このアプローチを使用して、複数のコンストラクター間でコードのブロックを共有できます。 オラクルのドキュメント