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クラスのファイルサイズは文字列分だけ減少する。これは、実行時にならないとFOOBARに何が入るかがわからないためだ。

これまでの業務では、今回の例のようにConst.FOOみたいに使用してきたことが多かったように思う。特に業務では膨大な数の定数を持つ定数クラスを定義し、いろいろなクラスから使用していた気がする。幸いクラスファイルのサイズが大きくて困ったようなことはなかったが、今後、クラスファイルのサイズを減らしたい工夫をするときに、ちょっと使えるかもしれない。

コメント

コメント一覧 (1件)

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

rdera へ返信する コメントをキャンセル

目次