【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<>(); // エラー: 再代入不可