後輩に教わったのでメモ。
たとえば、以下のような定数用のクラス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
みたいに使用してきたことが多かったように思う。特に業務では膨大な数の定数を持つ定数クラスを定義し、いろいろなクラスから使用していた気がする。幸いクラスファイルのサイズが大きくて困ったようなことはなかったが、今後、クラスファイルのサイズを減らしたい工夫をするときに、ちょっと使えるかもしれない。
コメント
コメント一覧 (1件)
>今後、クラスファイルのサイズを減らしたい工夫をするときに、ちょっと使えるかもしれない。
クラスファイルのサイズなんて、まったく意識したことがなかったんだけど。
工夫が必要になるのかなぁ〜。
そのときはこの方法を使わせて頂きます。