/** * ドメイン非依存URL出力フィルタ * javadrill.tech移行時はwp_options.home/siteurlのみ変更すればよい * * データベースには絶対URL(https://minner.asia)を保持し、 * 表示時に現在のドメイン(home_url())に動的変換する */ function javadrill_make_urls_dynamic($content) { if (empty($content)) { return $content; } // データベース内の絶対URLを現在のhome_url()に置換 $old_url = 'https://minner.asia'; $new_url = untrailingslashit(home_url()); // http版も対応(念のため) $content = str_replace($old_url, $new_url, $content); $content = str_replace('http://minner.asia', $new_url, $content); return $content; } // 投稿本文、ウィジェット、タームの説明、抜粋に適用 add_filter('the_content', 'javadrill_make_urls_dynamic', 20); add_filter('widget_text', 'javadrill_make_urls_dynamic', 20); add_filter('term_description', 'javadrill_make_urls_dynamic', 20); add_filter('get_the_excerpt', 'javadrill_make_urls_dynamic', 20); 104 「static修羅道」 Step06 解答例 | Javaドリル

104 「static修羅道」 Step06 解答例

eyecatch104-step06 104「static修羅道」

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:
// ここ、分かると一気にラクになる。マジで。

🎯 実習で理解を深めよう

この内容についてJavaDrillで実際に手を動かして学習できます

コメント

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