Javaで定数クラスを使用するときに、知っておくと嬉しいかもしれない小技

後輩に教わったのでメモ。

たとえば、以下のような定数用のクラス(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みたいに使用してきたことが多かったように思う。特に業務では膨大な数の定数を持つ定数クラスを定義し、いろいろなクラスから使用していた気がする。幸いクラスファイルのサイズが大きくて困ったようなことはなかったが、今後、クラスファイルのサイズを減らしたい工夫をするときに、ちょっと使えるかもしれない。

気に入ったらシェアお願いします!

この記事を書いた人

こんにちは!カノといいます👓
インターネットやテクノロジー、ビジネスモデルや歴史(世界史・日本史)、美術などが好きです。メガネのせいか真面目っぽく見えるらしいですが、基本的には昔からいい加減な性格です。
このブログは昔からずっと個人的な日記みたいな感じで書いてきていて、基本的には個人的なログになりますが、興味のあるところだけ読んでいただけるとうれしいです。コメントやTwitterのフォローなどは大歓迎です。

コメント

コメント一覧 (1件)

  • >今後、クラスファイルのサイズを減らしたい工夫をするときに、ちょっと使えるかもしれない。
    クラスファイルのサイズなんて、まったく意識したことがなかったんだけど。
    工夫が必要になるのかなぁ〜。
    そのときはこの方法を使わせて頂きます。

コメントする

目次