Javaには「final修飾子」という便利な機能があります。
この記事では、
・final修飾子の使い方
・クラスでfinalを使用する方法
・メソッドでfinalを使用する方法
という基本的な内容から、
・finalの速度面での比較
などに関しても解説していきます。
今回はそんなfinal修飾子について、さまざまな方法をわかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
final修飾子の使い方
final修飾子は、変数のように何度も値を設定することができず、一度値を設定したら変更できないようにするために使用します。
主に変更する予定のない規定値などの値を設定するときに、以下のように宣言して使用します。
public static final double DNUM = 3.1415926535
final修飾子を使用した定数の使い方については、以下の記事で詳しく解説しています。
final修飾子は、変数の値を変更したくないときに使用しますが、クラスやメソッドでも同様に内容を変更できないようにする目的で使用することが可能です。
クラスでfinalを使用する方法
final修飾子を指定してクラスを宣言すると、基本的にその親クラスはサブクラスで継承することができません。
クラスをfinal修飾子で使用する目的としては、サブクラスで不用意に値を変えられたくないときや、親クラスの安全性を保つために使用されます。
クラスをfinalで指定する場合には、以下のように記述します。
final class 「クラス名」{ //処理内容 }
以下のように親クラスをfinalで指定すると、extendsを使用した親クラスの継承が設定できずに、コンパイルエラーとなります。
final class FruitsClass{ FruitsClass(){ System.out.println("FruitClass"); } } class AppleClass extends FruitsClass{ AppleClass(){ System.out.println("AppleClass"); } }
メソッドでfinalを使用する方法
親クラスのメソッドの内容を、サブクラスで不用意に変えられたくない場合は、メソッドにfinal修飾子を指定することもできます。
final修飾子でメソッドを指定する場合は、以下のように記述します。
final void 「メソッド名」{ //処理内容 }
以下のように親クラスであるFruitsClassのメソッドに対して、final修飾子を付与すると、サブクラスで親クラスのメソッドのオーバーライドができなくなります。
class FruitsClass{ final void fruits(){ //処理内容 } } class AppleClass extends FruitsClass{ void fruits(){ //処理内容 } }
finalのパフォーマンス
final修飾子を指定した場合の速度面はどうなのでしょうか?
以下にfinal修飾子を指定した定数と通常の変数で、ループの中で1000回演算したときの速度を、ナノ秒単位で計測してみました。
public class FinalClass { //クラス定数を宣言 public static final int NUM = 10; public static void main(String[] args) { //速度計測 finalあり long start1 = System.nanoTime(); int fval =0; for ( int i=0; i<1000; i++){ fval = fval + NUM + i; } long end1 = System.nanoTime(); System.out.println("final : " + (end1 - start1) / 1000000f + "ms"); //速度計測 finalなし int num = 10; int val =0; long start2 = System.nanoTime(); for ( int j=0; j<1000; j++){ val = val + num + j; } long end2 = System.nanoTime(); System.out.println("not final : " + (end2 - start2) / 1000000f + "ms"); } }
実行結果 <1回目> final : 0.017818ms not final : 0.023921ms <2回目> final : 0.012512ms not final : 0.025403ms <3回目> final : 0.012461ms not final : 0.02599ms
実行結果のとおり、finalを付加したほうが処理速度が早いことがわかりました!
クラスについてもっと詳しく知りたい方へ
クラスのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!
finalについてもっと詳しく知りたい方へ
finalのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!
まとめ
ここではfinal修飾子について、意味や基本的な使い方の説明、定数と変数の速度比較の検証を行いました。
final修飾子は不用意に変数や、クラス・メソッドの内容を変えられたくないときに使用します。
もし、クラスやメソッドをfinalで指定する方法を忘れてしまったら、この記事を思い出してくださいね!