後輩に教わったのでメモ。
たとえば、以下のような定数用のクラス(Const.java)を作成して、
class Const {
public static final String FOO = "foofoo";
public static final String BAR = "barbar";
}
それを、次のように別のクラス(Main.java)から使用するプログラムを書く。
class Main {
public static void main(String[] args) {
System.out.println(Const.FOO);
System.out.println(Const.BAR);
}
}
別に問題はないし、よくやっていた気がする。
が、Main.javaをコンパイルしてできたMainクラス(Main.class)の内部には、Constクラスのフィールドである文字列"foofoo"や"barbar"がコピーされているらしい。恥ずかしながら知らなかった。極端な話、Mainクラス実行時にConst.classは必要ないわけだ。
しかし次のように、Const.javaにおいて、定数の初期化をスタティックイニシャライザを使っておこなうと、文字列はMainクラスにコピーされない。
class Const {
public static final String FOO;
public static final String BAR;
static {
FOO = "foofoo";
BAR = "barbar";
}
}
つまり、Mainクラスのファイルサイズは文字列分だけ減少する。これは、実行時にならないとFOOやBARに何が入るかがわからないためだ。
これまでの業務では、今回の例のようにConst.FOOみたいに使用してきたことが多かったように思う。特に業務では膨大な数の定数を持つ定数クラスを定義し、いろいろなクラスから使用していた気がする。幸いクラスファイルのサイズが大きくて困ったようなことはなかったが、今後、クラスファイルのサイズを減らしたい工夫をするときに、ちょっと使えるかもしれない。
最近のコメント