Yahoo! JAPAN
a.classからb.classを参照していませんか?
例えば、
public class a{
private String str = b.VALUE;
}
public class b{
public static final String VALUE = ”aaa”;
}
みたいなソースの場合、
aからはbのVALUEを参照しているので、
aのサイズは変わらないと思われがちですが、
Stringとプリミティブ型のstatic finalで宣言された値は
コンパイラの最適化フェーズで自動的に
インライン化されるため、
実質
public class a{
private String str = ”aaa”;
}
というコードをコンパイルしていることになります。
ですので、b.classの内容が変われば、
当然a.classの内容も変わることがあります。
コンパイラの実装によっても違いますが、
定数だけではなく、メソッドもバイトコードレベルでインライン化されますので、
参照先のクラスが違えば同じコードでも
コンパイル後のサイズが違うというのは十分に起こりうる現象となります。
http://java-house.jp/ml/archive/j-h-b/016071.html
[JavaHouse-Brewers:16071] [Q]:static final $B$NJ8;zNs$K$D$$$F(B
a.javaがb.java以降のstatic final な文字列を参照している場合は、staticリンクなのでその文字列を取り込んでいる場合があります。
その場合、コンパイルのタイミングでサイズが違う場合があります。
もちろん、フルビルドを行えば同一のサイズになります。
ありがとうございます。勉強になりました。
やはりそうなのですか。ありがとうございます。勉強になります。