Java 逆引き集 | final の使い方(変数・クラス・メソッド) — 不変性確保

Java Java
スポンサーリンク

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 の効果がよく理解できます。

タイトルとURLをコピーしました