104 「static修羅道」 Step06 解答例


AppConfig.java

import java.time.LocalDateTime;

public class AppConfig {

  // アプリのバージョン(クラス共通で1つ)
  public static String VERSION;

  // デバッグモード(true: ON, false: OFF)
  public static boolean DEBUG_MODE;

  // 読み込まれた時刻
  public static LocalDateTime LOADED_AT;

  // static初期化ブロック:クラスが最初に読み込まれた時に1度だけ実行される
  static {
    VERSION = "1.0.0";
    DEBUG_MODE = true;
    LOADED_AT = LocalDateTime.now(); // 実行時の時刻を記録
  }

  // 設定情報を出力するメソッド(staticなのでインスタンス化不要)
  public static void printConfig() {
    System.out.println("App Config:");
    System.out.println("VERSION: " + VERSION);
    System.out.println("DEBUG_MODE: " + DEBUG_MODE);
    System.out.println("LOADED_AT: " + LOADED_AT);
  }

  // インスタンス化は不要なのでコンストラクタは定義しない
}

Main.java

public class Main {
  public static void main(String[] args) {
    // アプリ設定情報を出力
    AppConfig.printConfig();
  }
}

実行結果(例)

App Config:
VERSION: 1.0.0
DEBUG_MODE: true
LOADED_AT: 2025-05-26T10:15:30.123456

(※ 実行タイミングによって LOADED_AT の値は変わります)


解説

この問題では、static初期化ブロックの特徴と用途を理解します。


static初期化ブロックとは?

static {
  // 初期化処理
}

これは クラスが最初に読み込まれた瞬間に1度だけ実行される 特別なブロックです。

  • コンストラクタと違い、インスタンスを作らなくても実行される
  • 初期値に時間や外部情報を含めるときに便利
  • static変数の複雑な初期化処理 に向いている

static変数と初期化の関係

public static String VERSION;

このように定義された static 変数は、**クラス全体で共有される「設定項目」**のようなものです。

たとえば:

  • VERSION: 固定値(定数でもいい)
  • DEBUG_MODE: 動作モードの切り替えに使える
  • LOADED_AT: 起動時刻など、1回だけ決定するべき値

こういった値を「まとめて」初期化できるのが staticブロックの強みです。


なぜコンストラクタではなく staticブロックなのか?

  • コンストラクタは インスタンスごとに呼ばれる
  • AppConfig のような設定クラスは newしない設計なので、コンストラクタが実行されない
  • それでも「一度だけの初期化」は必要
    → そこで static初期化ブロックを使う

まとめ

  • static {}クラスが最初にロードされた瞬間に実行される1回限りの処理
  • static 変数の複雑な初期化や外部依存の初期化に適している
  • この仕組みを使えば、newしないクラスでも一度きりの準備ができる

104 ステップアップ問題 「static修羅道」


Just Keep Typing, Baby!では、この「static修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!

// tesh:
// ここ、分かると一気にラクになる。マジで。