Java
 Computer >> コンピューター >  >> プログラミング >> Java

【Java】空白final変数をすべてのコンストラクターで明示的に初期化する必要がある理由

空白final変数とは

宣言時に初期化されていないfinal変数は、空白final変数(blank final variable)と呼ばれます。

なぜ明示的な初期化が必要なのか

通常、インスタンス変数はコンストラクター内で初期化します。仮に初期化を忘れたとしても、コンストラクターによって各型のデフォルト値(数値型なら0、boolean型ならfalse、参照型ならnullなど)が自動的に割り当てられます。

ところが、空白final変数にはデフォルト値が割り当てられません。これは、final変数が「一度だけ代入できる」という厳格な保証を持つためです。Javaコンパイラーは、final変数が確実に1回だけ初期化されることを保証する必要があり、暗黙的なデフォルト値の代入はこの保証を損なってしまうため許可されていません。

そのため、コンストラクターで初期化せずに空白final変数を使用しようとすると、コンパイル時エラーが発生します。

コード例(エラーになるケース)

public class Student {
   public final String name;
   public void display() {
      System.out.println("Name of the Student: "+this.name);
   }
   public static void main(String args[]) {
      new Student().display();
   }
}

コンパイル時エラー

このプログラムをコンパイルすると、次のようなエラーが出力されます。

Student.java:3: error: variable name not initialized in the default constructor
   private final String name;
                          ^
1 error

正しい書き方:すべてのコンストラクターで初期化する

したがって、final変数は宣言後に必ず一度初期化しなければなりません。クラスに複数のコンストラクターが定義されている場合は、すべてのコンストラクターで空白final変数を初期化する必要があります。

コード例(正常に動作するケース)

public class Student {
   public final String name;
   public Student() {
      this.name = "Raju";
   }
   public Student(String name) {
      this.name = name;
   }
   public void display() {
      System.out.println("Name of the Student: "+this.name);
   }
   public static void main(String args[]) {
      new Student().display();
      new Student("Radha").display();
   }
}

実行結果

Name of the Student: Raju
Name of the Student: Radha

補足ポイント

  • あるコンストラクター内で this(...) を使って別のコンストラクターへ処理を委譲している場合、実際の代入は呼び出し先のコンストラクターで行われるため、そこでの初期化だけで十分です。
  • staticな空白final変数の場合は、コンストラクターではなくstaticイニシャライザー(静的初期化ブロック)で初期化する必要があります。
  • 宣言と同時に初期化すれば、空白final変数として扱われず、コンストラクターでの初期化は不要になります。
  1. Javaのfinalキーワードとは?変数・メソッド・クラスでの使い方を解説

    finalは、Javaにおける非アクセス修飾子のひとつです。クラス、メソッド、変数の実装を「確定」させるために使用され、これらが後から変更されることを防ぐ役割を持ちます。本記事では、finalキーワードの基本的な概念と、変数・メソッド・クラスそれぞれでの使い方をコード例とともに解説します。final変数final変数は、明示的に初期化できるのは一度だけです。また、finalで宣言された参照変数は、別のオブジェクトを参照するように再代入することはできません。ただし、オブジェクト内部のデータ自体は変更可能です。つまり、オブジェクトの「状態」は変えられるものの、「参照先」は変えられないという点に注意

  2. 「無料ホームページ」は絶対に避けるべき!知られざるリスクと後悔しない選択とは

    騙されてはいけません。いわゆる「無料ホームページ」は、いつか必ず訪れる悪夢の種です。「自分でサーバー代を払うのは無理」と思い込み、お金をかけずに済ませることで問題を回避できている——そう感じているかもしれません。 しかし実際には、あなたは必ず「支払い」をすることになります。ただし、想定していた形ではない形でです。サイト全体が広告まみれになり、せっかくのアクセスが逃げていくのがその一つ。また、「https://gloverdesigns.totallyfreewebsite.com」のようなURLでは、相手に真剣に受け取ってもらえず、ビジネスチャンスを失うこともあります。さらに最悪の場合、デー