イニシャライザ(initializer) ― staticイニシャライザとインスタンスイニシャライザ
クラスの初期化処理をおこなうには、通常、コンストラクタを使うが、Javaではイニシャライザ(initializer)を使う事もできる。
イニシャライザは「初期化子」とも呼ばれている。
イニシャライザには、staticイニシャライザとインスタンスイニシャライザとがある。
staticイニシャライザ
staticイニシャライザは、インスタンスでは無く、クラス(静的メンバー)を初期化するのに使われる。
javaには、C#のように静的コンストラクタ(staticクラス(静的クラス)と静的コンストラクタ - 愚鈍人を参照) が存在しないので、クラスの静的(static)メンバーを初期化するには、代わりにstaticイニシャライザを使う事になる。
staticイニシャライザのプログラム例を以下に示す。
リスト1-staticイニシャライザの例(StaticInitializerSample1.java)
複数のstaticイニシャライザを定義することも可能である。
可能だからと言って、複数書くのはプログラムが読みづらくなるだけなので、どうしても必要な場合以外はやめた方が良い。
staticイニシャライザが複数ある場合は、上から順に実行される。
staticイニシャライザの実行されるタイミングを調べる為に、以下のようなstaticイニシャライザを複数含んだクラスを作成した。
リスト2(StaticInitializerSample2.java)
mainメソッドからリスト2のクラスにアクセスするクラスの例を以下に示す。
実行結果は以下のようになる。
MainClass1クラスのmainメソッドよりstaticな定数CONST_NUMBEにアクセスしてもstaticイニシャライザは実行されないが、 static変数にアクセスする前の時点でstaticイニシャライザが呼び出されている。
staticイニシャライザの実行によって変数aの値がどのように変化するかがわかる。
インスタンスイニシャライザ
staticイニシャライザがクラスを初期化するのに使われるのに対して、インスタンスイニシャライザはインスタンスを初期化するのに使われる。
インスタンスを初期化する手段としては、既にコンストラクタが存在するので、インスタンスイニシャライザの必要性については疑問を感じる。
staticイニシャライザがあるので、単にインスタンスイニシャライザもサポートしなくてはと思って付けた機能なのだろうか?
C#のようにイニシャライザの機能を持たずに、静的コンストラクタにした方がスッキりすると思う
インスタンスを初期化には、コンストラクタのみを使いインスタンスイニシャライザは使わない方が、可読性の高いプログラムとなり良いと思う。
インスタンスイニシャライザとコンストラクタのどちらが先に実行されるのだろうか?
以下のプログラムを使って試してみた。
実行結果は以下のようになった。
インスタンスイニシャライザの方が、コンストラクタより先に実行されているのがわかる。
インスタンスイニシャライザの意外な使い道-匿名クラスの初期化
インスタンスイニシャライザは使わないと述べたが、実は、インスタンスイニシャライザには面白い使い道が存在する。
それは、匿名クラスの初期化である。 (匿名クラス(無名クラス)とイベントリスナー - 愚鈍人を参照)
参考URL