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しないクラスでも一度きりの準備ができる
Just Keep Typing, Baby!では、この「static修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!
// tesh:
// ここ、分かると一気にラクになる。マジで。