finalフィールドの参照

finalフィールドの文字列への参照は、コンパイル時に置き換えられる。
知ってはいたけど確かめたことはなかったので、改めて確認。


まずfinalフィールドを持つクラス。


public class A {
public static final String ABC = "xyz";
public static void main(String[] args) {
System.out.println(ABC);
}
}
そして、参照するクラス。

public class Main {
public static void main(String[] args) {
System.out.println("A-ABC : " + A.ABC);
}
}
このMainを実行した結果。

A-ABC : xyz
順当な結果。
ここで、AのフィールドABCの値を"final"にして、Aのみコンパイルする。


まずは、Aを実行した結果


final
きちんと変わってる。
でも、Mainを実行すると・・・

A-ABC : xyz
というわけで、"final"に変更したのに、"xyz"のまま。


きちんと確認するため、Mainを逆コンパイルしてみる。
コンパイルにはjadを使用。


public class Main
{

public Main()
{
}

public static void main(String args[])
{
System.out.println("A-ABC : xyz");
}
}

確かにSystem.out.printlnの部分が、A.ABCからただの文字列に置き換わってる。
ちなみに、intとかでも置き換わるみたい。


Eclipseとか使ってると意識しないけど、たまーにこういったことで
問題が出るんだよなぁ。