final の使い方(変数・クラス・メソッド) — 不変性確保
Javaの final は「これ以上変更できない」という意味を持ちます。対象が 変数 か クラス か メソッド かによって効果が変わります。初心者向けに、コード例とテンプレートを交えて解説します。
変数に付ける場合 — 値の再代入禁止
基本
final int x = 10;
// x = 20; // コンパイルエラー(再代入不可)
Java- プリミティブ型: 値そのものが固定される。
- 参照型: 参照先を変えられないが、中身の変更は可能。
final int[] arr = {1, 2, 3};
arr[0] = 99; // OK(中身は変更可能)
// arr = new int[5]; // NG(参照先を変えるのは不可)
Java👉 「変数の箱を固定する」イメージ。
クラスに付ける場合 — 継承禁止
final class Utility {
public static void hello() { System.out.println("Hello"); }
}
// class SubUtility extends Utility {} // コンパイルエラー
Java- 用途: ユーティリティクラスやセキュリティ上継承させたくないクラス。
- 効果: そのクラスをサブクラス化できなくなる。
👉 「このクラスは完成形、拡張禁止」イメージ。
メソッドに付ける場合 — オーバーライド禁止
class Parent {
public final void greet() { System.out.println("Hi"); }
}
class Child extends Parent {
// public void greet() { ... } // コンパイルエラー(オーバーライド不可)
}
Java- 用途: サブクラスで変更されたくない処理。
- 効果: メソッドのオーバーライドを禁止する。
👉 「この処理は絶対に変えない」イメージ。
例題で練習
例題1: 定数の定義
class Config {
public static final double TAX_RATE = 0.10;
public static final String APP_NAME = "Shop";
}
System.out.println(Config.TAX_RATE); // 0.1
Java👉 定数は static final で定義。大文字+アンダースコアが慣習。
例題2: 不変オブジェクトの設計
final class Point {
private final int x;
private final int y;
public Point(int x, int y) { this.x = x; this.y = y; }
public int getX() { return x; }
public int getY() { return y; }
}
Point p = new Point(3, 5);
// p.x = 10; // NG(フィールドはfinalで変更不可)
Java👉 フィールドを final にすると「作った後は変わらない」不変オブジェクトになる。
例題3: 継承禁止のユーティリティ
final class MathUtil {
private MathUtil() {} // インスタンス化禁止
public static int add(int a, int b) { return a + b; }
}
System.out.println(MathUtil.add(3, 4)); // 7
Java👉 ユーティリティクラスは final + private コンストラクタで「拡張も生成も禁止」。
例題4: オーバーライド禁止メソッド
class Base {
public final void log(String msg) {
System.out.println("[LOG] " + msg);
}
}
class Sub extends Base {
// log を変更できないので必ず同じ形式で出力される
}
Java👉 ログ出力など「絶対に変えてほしくない処理」に final を付ける。
テンプレート集
変数
final 型 変数名 = 初期値;
Java定数(クラススコープ)
public static final 型 定数名 = 値;
Javaクラス
public final class クラス名 { ... }
Javaメソッド
public final 戻り値型 メソッド名(...) { ... }
Javaまとめ
- 変数に final: 再代入禁止。定数や不変フィールドに。
- クラスに final: 継承禁止。ユーティリティや完成形クラスに。
- メソッドに final: オーバーライド禁止。処理を固定したいときに。
- 不変性の確保: final を組み合わせることで「変わらない設計」を保証できる。
👉 練習課題として「銀行口座クラス」を作り、口座番号を final フィールドにして変更不可、残高は通常フィールドで変更可能にすると、final の効果がよく理解できます。
