Javaでブランクfinal変数(空白final変数)は初期化できる?
結論:はい、初期化できます
Javaでは、宣言時に値を代入しない「ブランクfinal変数(空白final変数)」を作成することができます。ただし、final変数である以上、使用する前に必ず一度だけ初期化しなければなりません。
この初期化は、次のいずれかの場所で行うことができます。
- コンストラクタ
- インスタンス初期化ブロック
1. コンストラクタで初期化する方法
最も一般的なのは、コンストラクタ内で値を代入する方法です。オブジェクト生成時に引数として渡した値を、final変数に設定できます。
public class Sample {
// ブランクfinal変数(宣言時には初期化しない)
private final int value;
// コンストラクタ内で初期化
public Sample(int value) {
this.value = value;
}
}
2. インスタンス初期化ブロックで初期化する方法
インスタンス初期化ブロックを使えば、どのコンストラクタが呼ばれても共通の値で初期化できます。初期化ブロックはコンストラクタよりも先に実行されます。
public class Sample {
private final int value;
// インスタンス初期化ブロック内で初期化
{
value = 100;
}
public Sample() {
// 初期化ブロックですでにvalueへ代入済み
}
}
押さえておきたい初期化ルール
- final変数への代入は一度きりしかできません。二重に代入するとコンパイルエラーになります。
- インスタンス初期化ブロックで初期化していない場合、すべてのコンストラクタの経路で必ず初期化する必要があります。
- staticなfinal変数(定数)の場合は、staticイニシャライザ(
static { ... })または宣言時に初期化します。 - 初期化前に変数を読み取ろうとすると、「variable might not have been initialized」というコンパイルエラーが発生します。
まとめ
ブランクfinal変数は、コンストラクタまたはインスタンス初期化ブロックで初期化可能です。この仕組みを活用すれば、オブジェクトごとに異なる不変の値を持たせることができ、柔軟かつ安全な設計につながります。
-
Javaのfinal変数とは?使い方と定数宣言の基本を解説
Javaにおけるfinal変数は、明示的な初期化を一度しか行えない変数です。一度値を代入すると、その後は再代入することができません。 また、参照型変数にfinalを付けた場合、その参照先のオブジェクトを別のオブジェクトに変更することはできません。ただし、オブジェクト内部のデータ(フィールドの値など)は変更可能です。つまり、オブジェクトの状態は変更できるが、参照自体は変更できないという点に注意が必要です。 final修飾子とstaticの組み合わせ 変数に対してfinal修飾子を使用する場合、多くの場面でstaticキーワードと組み合わせて使われます。これにより、定数がクラス変数(クラス全体で共
-
Javaのfinalキーワードとは?変数・メソッド・クラスでの使い方を解説
finalは、Javaにおける非アクセス修飾子のひとつです。クラス、メソッド、変数の実装を「確定」させるために使用され、これらが後から変更されることを防ぐ役割を持ちます。本記事では、finalキーワードの基本的な概念と、変数・メソッド・クラスそれぞれでの使い方をコード例とともに解説します。final変数final変数は、明示的に初期化できるのは一度だけです。また、finalで宣言された参照変数は、別のオブジェクトを参照するように再代入することはできません。ただし、オブジェクト内部のデータ自体は変更可能です。つまり、オブジェクトの「状態」は変えられるものの、「参照先」は変えられないという点に注意