定数はコンパイル時にclassファイルに展開されたりされなかったりする話

Javaで定数を使用しているとき、classファイル生成時に定数はインライン展開されます。

 

例えばこんなの

public class Const{

  public static final String STR_A = "AAA”;

}

 

public static class Hoge{

  system.out.println(Const.STR_A);

}

これをコンパイルすると、実際のclassファイルではこんな感じになっている

public static class Hoge{

  system.out.println(”AAA");

}

これを見て、「おっ、つまりstaticでfainalなフィールドは全部インライン展開されるんだな」と思っていたんだけど、そうではない。

 

public class Const{

 public static final int[] ARRAY_A = {0,1,2,3}

}

 

public class Hoge{

 system.out.println(Const.ARRY_A[1]);

}

 

 

こんなプログラムがあったとして、コンパイルしたときにHogeクラスが

 system.out.println(1);

とかになってると思いきや、実際は

public class Hoge{

 system.out.println(Const.ARRY_A[1]);

}

配列の場合は展開されません。

っていうのを先週知りました。