【Java】final修飾子について

【Java】final修飾子について

final修飾子とは

Javaのfinal修飾子は、値や振る舞いを固定して変更を防ぐために使用されます。変数、メソッド、クラスに適用することができ、それぞれ異なる意味を持ちます。具体的な用途について以下で詳しく解説します。

変数に使用するfinal

final修飾子を変数に適用すると、その変数の値を一度だけ設定することができます。設定後は再代入が不可能になります。

final int number = 10;
number = 20; // エラー: 再代入できない

ローカル変数やフィールドに適用できますが、フィールドに使用する場合はコンストラクタ内で初期化することも可能です。

コンストラクタで初期化する例

class Example {
    final int value;

    Example(int value) {
        this.value = value; // 初期化
    }

    void setValue(int newValue) {
        this.value = newValue; // エラー: 再代入できない
    }
}

メソッドに使用するfinal

final修飾子をメソッドに適用すると、そのメソッドをサブクラスでオーバーライドできなくなります。

class Parent {
    final void display() {
        System.out.println("Parentのメソッド");
    }
}

class Child extends Parent {
    @Override
    void display() { // エラー: オーバーライドできない
        System.out.println("Childのメソッド");
    }
}

これにより、メソッドの振る舞いが固定され、意図しない変更を防止できます。

クラスに使用するfinal

final修飾子をクラスに適用すると、そのクラスを継承できなくなります。

final class FinalClass {
    void display() {
        System.out.println("FinalClassのメソッド");
    }
}

class SubClass extends FinalClass { // エラー: FinalClassを継承できない
}

この機能は、クラスの設計上サブクラス化を避けたい場合に便利です。例えば、不変クラス(Immutable Class)の作成に用いられることが多いです。

finalとパフォーマンスの最適化

JavaコンパイラやJVMはfinal修飾子を使用している部分を最適化しやすくなります。特にfinalフィールドは、コード内で不変であることが保証されるため、値をインライン化するなどの最適化が可能です。

final int CONSTANT = 100;
// JVMがCONSTANTを最適化する可能性がある

よくある間違いと注意点

  • final修飾子を付けた変数でも、オブジェクトの内容は変更可能であることに注意してください。
  • final修飾子を付けるときは、設計意図を明確にすることが重要です。

final List<String> list = new ArrayList<>();
list.add("追加可能"); // リストの内容は変更可能
list = new ArrayList<>(); // エラー: 再代入不可

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です