Javaのfinalキーワードを完全ガイド!初心者でもわかる読み取り専用フィールドの使い方
生徒
「先生、Javaで一度値を設定したら変更できない変数って作れますか?」
先生
「はい、Javaではfinalキーワードを使うことで、読み取り専用のフィールドを作成できます。」
生徒
「具体的にはどうやって使うんですか?」
先生
「それでは、finalキーワードの基本的な使い方を見ていきましょう!」
1. finalキーワードとは?
Javaのfinalキーワードは、変数、メソッド、クラスに適用できる修飾子です。finalを使うことで、以下のような制限を設けることができます。
- 変数:一度値を設定したら再代入できない。
- メソッド:サブクラスでオーバーライドできない。
- クラス:継承できない。
今回は、変数にfinalを使って、読み取り専用のフィールドを作成する方法に焦点を当てます。
2. final変数の基本的な使い方
final変数は、一度値を設定すると再代入できません。以下は基本的な例です。
public class ConstantsExample {
public static void main(String[] args) {
final int MAX_USERS = 100;
System.out.println("最大ユーザー数: " + MAX_USERS);
}
}
この例では、MAX_USERSは一度値を設定したら変更できません。
3. finalフィールドの初期化方法
finalフィールドは、以下のいずれかの方法で初期化する必要があります。
- 宣言時に初期化:変数の宣言と同時に値を設定する。
- コンストラクタで初期化:クラスのコンストラクタ内で値を設定する。
以下はコンストラクタで初期化する例です。
public class User {
private final String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
このように、finalフィールドは必ず一度だけ初期化する必要があります。
4. finalと参照型の注意点
finalは参照型にも適用できますが、参照先のオブジェクト自体は変更可能です。以下の例を見てみましょう。
import java.util.ArrayList;
import java.util.List;
public class FinalReferenceExample {
public static void main(String[] args) {
final List<String> items = new ArrayList<>();
items.add("Apple");
items.add("Banana");
System.out.println(items);
}
}
この例では、itemsというリストはfinalで宣言されていますが、リストに要素を追加することは可能です。つまり、finalは参照先を変更できないだけで、参照先のオブジェクトの状態は変更可能です。
5. 不変オブジェクト(Immutable Object)の作成
オブジェクトの状態を完全に変更不可にしたい場合は、不変オブジェクトを作成します。以下はその例です。
public final class ImmutableUser {
private final String name;
private final int age;
public ImmutableUser(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
このクラスでは、すべてのフィールドがfinalであり、ゲッターのみを提供しています。これにより、オブジェクトの状態を変更することができなくなります。
6. finalの利点と活用方法
finalを使用することで、以下のような利点があります。
- コードの安全性向上:意図しない再代入を防ぐ。
- 可読性の向上:変数が変更されないことを明示できる。
- スレッドセーフ:不変オブジェクトはスレッドセーフであるため、マルチスレッド環境での安全性が向上する。
特に、定数や設定値など、変更されるべきでない値にはfinalを積極的に使用しましょう。