• ベストアンサー

final修飾子について

会社の先輩が書いたソースなんですが、 ローカル変数でやたらfinalを使っていたんです。 final int ... //計算式 final double ... //計算式 final long ... //計算式 final String ... //計算式 合計20くらい・・・ あまりfinalが多いとメモリの消費が激しくなって パフォーマンスの低下につながると思うのですが、 みなさんはどう思いますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

どうなんでしょうね? クラス、およびメソッドののfinal化は、 Javaプログラムのパフォーマンスを良くします。 Javaのパフォーマンス関係の本を見ると、 「クラスをfinalにすると効率は上がるよ。 でも再利用できなくなるから慎重にね」 と書いてあります。 ただ、ローカル変数のfinal化については、資料がありません。 気分的には、コンパイラが最適化する参考になるから、 パフォーマンスは良くなるように思います。 finalはC言語のconstにあたるものであり、 文法的には「変数の書き換えがない」ということを 強制するだけのもので、 良くはなっても悪くはならないような気がするのですが…。 簡単な実験をしてみました。 ----------- public static void main(String[] args){ int a = 5; String b = "abc"; System.out.println(a + b); ------------ という内容のクラスと ----------- public static void main(String[] args){ final int a = 5; final String b = "abc"; System.out.println(a + b); } ------------ という内容のクラスをコンパイルして、 できたclassファイルを比較してみました。 事前予想では、まったく同じファイルができると 思っていたのですが、違いました。 できたクラスファイルのサイズが、 前者が615バイト、 後者が404バイトになっていました。 これだけ見ると、パフォーマンスを良くする可能性が高いようです。 結果はJDKのバージョンで変わるとおもいますが、 それにしてもずいぶん違います。 私もこれからそうしようかな…。

kazuoao
質問者

お礼

おお! 私も実験してみました! すごいですね!! 大変参考になりました! ありがとうございます!

その他の回答 (1)

回答No.2

finalで定義した変数の値はコンパイル時に決定されます。また、その変数を参照している式や文も、その決定された値がコンパイル時に設定されますので実行効率はあがります。実行時に関しても代入(参照)という操作がなくなりますのでパフォーマンスや消費メモリも小さくなります。

kazuoao
質問者

お礼

どうもありがとうございました~!!!!!