4.

Javaの定数

編集

本稿は Java の定数に関する記事です。

定数とは?

定数とは、変数と同じくデータを格納・参照するものですが、一度データを格納すると書き換えはできません。プログラム全体で意味のある名前付きの不変値を扱うために使い、マジックナンバー (意味不明の数値) を排除する目的でも重宝します。

定数の宣言構文

構文

final データ型 変数名 = 値;

final int MAX_USERS = 100;

final 修飾子を付けると、その変数は一度しか代入できない定数として扱われます。再代入しようとするとコンパイルエラーになります。

クラス定数 (static final)

クラス内で固定値として共有したい場合は、public static final を付けてクラス変数として宣言します。命名は全大文字+スネークケースが慣習です。

public class Config {
    public static final int    MAX_USERS    = 100;
    public static final String API_BASE_URL = "https://api.example.com";
    public static final double PI          = 3.141592653589793;
}

// 使用
int limit = Config.MAX_USERS;

final が付く位置による意味の違い

位置意味
変数 (final int x)再代入禁止 = 定数化
メソッド引数 (void f(final int x))引数の再代入禁止
メソッド (final void m())サブクラスでオーバーライド禁止
クラス (final class C)継承禁止 (例: String クラス)

参照型 (オブジェクト) の final に注意

final List<String> names = new ArrayList<>();

names.add("Taro"); // OK (リストの中身は変更できる)
names = new ArrayList<>(); // ✕ コンパイルエラー (再代入は不可)

final「参照を変えない」 という意味で、「指し示している先の中身を変えない」 という意味ではありません。中身まで不変にしたい場合は不変コレクション (List.copyOfCollections.unmodifiableList、Guava の ImmutableList など) を使います。

列挙型 (enum) との使い分け

取りうる値が決まっている場合は、定数を並べる代わりに enum を使うとより安全です。

// 良くない: 定数の羅列
public static final int STATUS_DRAFT    = 0;
public static final int STATUS_PUBLISHED = 1;
public static final int STATUS_ARCHIVED  = 2;

// 良い: enum を使う
public enum Status { DRAFT, PUBLISHED, ARCHIVED }

enum なら型として誤った値を渡せない、switch の網羅性チェック、メソッドや属性を持たせる、といった利点があります。

定数を使う典型シーン

  • マジックナンバーの排除 (if (age >= 20)if (age >= ADULT_AGE))
  • 設定値・閾値・上限値の集約
  • 外部システムの URL・パス・ID
  • 数学定数 (Math.PIMath.E)
  • エラーメッセージ・ログタグ

命名規約

  • 定数名は全大文字 + スネークケース: MAX_USERSDEFAULT_TIMEOUT_MS
  • 単位を名前に含めると誤読を防げる (TIMEOUT_MSFILE_SIZE_BYTES)
  • 定数群はユーティリティクラスにまとめ、インスタンス化を防ぐ private コンストラクタを置く

注意点

  • final 付きフィールドはコンパイラに展開されることがあるため、jar を入れ替えても利用側の再ビルドが必要なケースがある
  • 本質的に不変なオブジェクト (IntegerString) と final 参照を混同しない
  • 定数クラスばかり増えると見通しが落ちる。用途別 / 機能別にまとめる
  • 設定値は定数より外部設定 (プロパティ/環境変数/Config 管理) のほうが良いケースが多い (ビルドし直さずに変えられる)
  • 定数を頻繁に書き換えるなら、それは「定数」ではなく「設定」にすべきサイン

関連

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 基本的なルール
  2. データ型
  3. 変数
  4. 定数
  5. 配列
  6. コレクション(List,Set,Queue)
  7. Map(連想配列)
  8. 演算子
  9. 条件分岐
  10. 繰り返し制御文
  11. クラス
  12. メソッド
  13. インスタンス化
  14. コンストラクタ
  15. staticキーワード
  16. オーバーロード
  17. 継承
  18. オーバーライド
  19. this
  20. super
  21. パッケージ
  22. アクセス修飾子
  23. 抽象クラス・メソッド
  24. インターフェース
  25. カプセル化
  26. データベース接続
  27. セッション
  28. ファイル入出力
  29. ラムダ式