こんにちは、ともです。
Javaにはイニシャライザというものが存在します。
イニシャライザには
- 初期化ブロック
- staticイニシャライザ
が存在し、初期化するときに利用します。
イニシャライザを知る以前は、初期化といえばコンストラクタという発想でした。イニシャライザを知ることで、よりコードが記述しやすくなると思いますので、私の理解を整理しておきたいと思います。
まずはコード
class A {
// 初期化ブロック
{
System.out.println("initialize");
}
// staticイニシャライザ
static {
System.out.println("static initialize");
}
// コンストラクタ
A() {
System.out.println("constuctor");
}
public void method() {
System.out.println("method");
}
}
public class Main {
public static void main(String[] args) {
new A();
System.out.println("=======");
new A();
}
}
Aというクラスに
- 初期化ブロック
- staticイニシャライザ
- コンストラクタ
を定義しました。
まずはmainメソッドを実行させ、実行順を確認すると次のような結果となります。
static initialize
initialize
constuctor
method
=======
initialize
constuctor
この結果を元に理解を深めて行きました。
実行順
実行の順番は次です。
- staticイニシャライザ
- 初期化ブロック
- コンストラクタ
であることがわかりました。
またstaticイニシャライザは、初めてクラスにアクセスする時に1度だけ実行されることがわかりました。
staticイニシャライザ
staticイニシャライザでやることは、
- static変数の初期化をする場所です。
- static変数以外の初期化はできない
class A {
static String test ="Hello";
static {
// クラスロードのタイミングで実行
test+=" World!";
}
}
public class Main {
public static void main(String[] args) {
// 初めてのクラスロード
System.out.println(A.test);
// 出力はHello World
}
}
A.testで初めてクラスにアクセスした際に実行していることがわかりました。
static変数の初期化をする際は、staticイニシャライザに記述するとコードがみやすくなりますね。
staticイニシャライザでの例外
staticイニシャライザで例外が発生した場合は、それを受け取る相手がいない為、エラーを出します。
その時のエラーは、ExceptionInInitializerErrorです。
まとめ
staticイニシャライザ・初期化ブロック・コンストラクタの実行順を確認しました。
実行順さえ理解しておけば、より柔軟にコードがかけるのではないでしょうか。
例えば、オーバーロードしたコンストラクタの前に実行させたいコードがあるなら初期化ブロックに記述すればいいですね。