カテゴリ: Javaのカプセル化 更新日: 2025/06/26

Javaのfinalキーワードを完全ガイド!初心者でもわかる読み取り専用フィールドの使い方

147
Java の read-only フィールド(final を使って変更を防ぐ)

先生と生徒の会話形式で理解しよう

生徒

「先生、Javaで一度値を設定したら変更できない変数って作れますか?」

先生

「はい、Javaではfinalキーワードを使うことで、読み取り専用のフィールドを作成できます。」

生徒

「具体的にはどうやって使うんですか?」

先生

「それでは、finalキーワードの基本的な使い方を見ていきましょう!」

1. finalキーワードとは?

1. finalキーワードとは?
1. finalキーワードとは?

Javaのfinalキーワードは、変数、メソッド、クラスに適用できる修飾子です。finalを使うことで、以下のような制限を設けることができます。

  • 変数:一度値を設定したら再代入できない。
  • メソッド:サブクラスでオーバーライドできない。
  • クラス:継承できない。

今回は、変数にfinalを使って、読み取り専用のフィールドを作成する方法に焦点を当てます。

2. final変数の基本的な使い方

2. 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フィールドの初期化方法

3. finalフィールドの初期化方法
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と参照型の注意点

4. 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)の作成

5. 不変オブジェクト(Immutable Object)の作成
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の利点と活用方法

6. finalの利点と活用方法
6. finalの利点と活用方法

finalを使用することで、以下のような利点があります。

  • コードの安全性向上:意図しない再代入を防ぐ。
  • 可読性の向上:変数が変更されないことを明示できる。
  • スレッドセーフ:不変オブジェクトはスレッドセーフであるため、マルチスレッド環境での安全性が向上する。

特に、定数や設定値など、変更されるべきでない値にはfinalを積極的に使用しましょう。

Javaのカプセル化の一覧へ
新着記事
Java の ArrayList に要素を削除・更新する方法
JavaのArrayListを完全解説!要素の削除・更新を初心者向けにやさしく理解しよう
Java の ArrayList を作成して要素を追加・取得する方法
JavaのArrayListを完全解説!作成・要素の追加・取得を初心者向けに丁寧に説明
Java のリストとは?配列と何が違うのかを理解しよう
Javaのリストとは?配列との違いを初心者向けにやさしく理解しよう
IAM Access Analyzerとは?未使用権限の分析・外部アクセス検出を徹底解説
IAM Access Analyzerとは?未使用権限の分析と外部アクセス検出を初心者向けに徹底解説!
人気記事
インスタンスタイプの料金比較と最適な選び方(最新2025年版)
AWSのインスタンスタイプの料金比較と最適な選び方【2025年最新版】
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説