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

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フィールドは必ず一度だけ初期化する必要があります。

Javaをこれから始める人や、 オブジェクト指向の考え方を基礎から理解したい人には、 定番の入門書がこちらです。

スッキリわかるJava入門 第4版をAmazonで見る

※ Amazon広告リンク

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を積極的に使用しましょう。

まとめ

まとめ
まとめ

finalキーワードの基本と役割をしっかり理解しよう

今回はJavaのfinalキーワードについて、初心者でも理解できるように基本から応用まで丁寧に学習しました。Javaにおけるfinalは非常に重要なキーワードであり、変数やフィールドを読み取り専用にすることで、安全で安定したプログラムを実現するための重要な仕組みです。Javaプログラミングでは、値を変更してはいけない場面が多く存在するため、このfinalの考え方を理解しておくことは非常に大切です。

final変数は再代入できないという重要な特徴

finalキーワードを使って宣言した変数は、一度値を設定すると再代入することができません。これは、プログラムの途中で値が書き換えられてしまうことを防ぐための仕組みであり、バグの発生を抑える効果があります。特に定数や設定値など、絶対に変わってはいけない値に対しては積極的にfinalを使用することが推奨されます。


public class FinalBasicSummary {
    public static void main(String[] args) {
        final int MAX_VALUE = 10;
        System.out.println(MAX_VALUE);
    }
}

10

finalフィールドは必ず一度だけ初期化する

Javaのfinalフィールドは、宣言時またはコンストラクタ内で必ず一度だけ初期化する必要があります。初期化されていない状態のままではコンパイルエラーとなるため、確実に値を設定する設計が求められます。この仕組みにより、オブジェクトの状態が途中で変わってしまうことを防ぐことができます。


public class FinalConstructorSummary {
    private final String name;

    public FinalConstructorSummary(String name) {
        this.name = name;
    }

    public void show() {
        System.out.println(name);
    }
}

参照型とfinalの関係を正しく理解する

finalは参照型にも使用することができますが、ここで重要なのは「参照先を変更できないだけ」であり、「中身は変更できる」という点です。つまり、finalで宣言されたオブジェクトでも、その内部のデータは変更可能です。この違いを理解していないと、思わぬバグの原因になることがあります。


import java.util.ArrayList;

public class FinalReferenceSummary {
    public static void main(String[] args) {
        final ArrayList<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        System.out.println(list);
    }
}

[A, B]

不変オブジェクトで安全な設計を実現する

finalを活用することで、不変オブジェクトを作ることができます。不変オブジェクトとは、一度作成したら状態が変わらないオブジェクトのことです。すべてのフィールドをfinalにし、セッターメソッドを用意しないことで実現できます。この設計はスレッドセーフであり、複数の処理が同時に動く環境でも安全に扱うことができます。


public final class ImmutableSummary {
    private final String name;

    public ImmutableSummary(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

finalを使うメリットと実務での活用

finalを使うことで、コードの安全性が向上し、可読性も高まります。また、開発チームで作業する場合でも、どの変数が変更されないかが明確になるため、バグの発生を防ぐことができます。実務では定数定義、設定値、IDなど、変更されるべきでない値には必ずfinalを付けるのが基本です。

Java初心者が覚えておくべき重要ポイント

Javaのfinalキーワードは、単なる文法ではなく、設計を安全にするための重要な考え方です。変数を固定することで意図しない変更を防ぎ、プログラムの品質を向上させることができます。特にJava入門段階では、finalを使うことでコードの意味が明確になり、読みやすくなるため積極的に活用しましょう。Javaプログラミング、finalキーワード、定数定義、読み取り専用フィールド、不変オブジェクトといった基本キーワードをしっかり理解しておくことが、今後の学習に大きく役立ちます。

先生と生徒の振り返り会話

生徒

finalを使うと値が変わらなくなるのがポイントですね。

先生

そうです。Javaでは非常に重要な基本ルールです。

生徒

コンストラクタで初期化する必要があるのも理解できました。

先生

それが安全な設計につながります。

生徒

参照型は中身が変わるのが少し意外でした。

先生

そこは多くの初心者がつまずくポイントです。

生徒

不変オブジェクトも作れるのは便利ですね。

先生

実務でもよく使う重要な考え方です。

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Javaのプログラムでfinalキーワードを使う最大のメリットは何ですか?初心者にもわかりやすく教えてください。

Javaプログラミングにおいて、finalキーワードを使用する最大のメリットは「コードの安全性と信頼性の向上」です。一度値を代入した変数に対して、後から誤って別の値を再代入しようとすると、プログラムを実行する前のコンパイル段階でエラーとして検知してくれます。これにより、開発者が意図しないデータの書き換えを防ぎ、バグの混入を未然に防止できるのが大きな利点です。また、他の開発者がコードを読んだ際にも「この変数の値はプログラムの途中で変わることがない」ということが一目で伝わるため、ソースコードの可読性が格段に高まります。
Javaのカプセル化の一覧へ
新着記事
Java
Javaの演算子の優先順位
Javaの演算子の優先順位を完全解説!初心者向けの丁寧な解説
Java
Javaのローカル変数と順次処理
Javaのローカル変数と順次処理を徹底解説!初心者でも理解できるコードの基本
Python
NumPyのdtype一覧!int・float・bool・str・objectの違いを比較
NumPyのdtype一覧を完全解説!int・float・bool・str・objectの違いを初心者向けに比較
Dart
Dartのコンストラクタまとめ!デフォルト・名前付きコンストラクタの使い方
Dartのコンストラクタまとめ完全ガイド!デフォルトコンストラクタと名前付きコンストラクタの使い方を初心者向けに解説
人気記事
Java
Java の Random クラスを使ってランダムな数値を生成する方法
JavaのRandomクラスの使い方を完全ガイド!初心者でもわかる乱数生成
Java
Java の getter メソッドと setter メソッドの使い方
Javaのgetterメソッドとsetterメソッドの使い方を完全ガイド!初心者でもわかるアクセス方法
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
AWS
【AWS】S3の料金体系まとめ!無料枠・課金ポイント・見積もり方法まで
【AWS】S3の料金体系まとめ!無料枠・課金ポイント・見積もり方法まで

🔌 USBポート不足を解消

Type-C 1本で拡張。
開発・作業環境を一気に快適に

UGREEN USB-Cハブを見る

※ Amazon広告リンク