Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JEP 526: Lazy Constants

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

JEP 526: Lazy Constants

2026/03/24 JJUGナイトセミナー「Java 26 リリース記念イベント」

Avatar for Aya Ebata

Aya Ebata

March 24, 2026
Tweet

More Decks by Aya Ebata

Other Decks in Technology

Transcript

  1. 自己紹介 - 名前: えばた あや - 𝕏: @aya_122 - 好き:

    ラーメン二郎 / いくら / ポケモン / たまごっち - お仕事: フリーランス  - Flutter / Python / Go / React
  2. 今までのfinal - logger は OrderController のインスタンス作成時に初期化される  - 処理によっては初期化に時間がかかる可能性がある  - 他の

    Controller からも同時に初期化される class OrderController { private final Logger logger = Logger.create(OrderController.class); ... }
  3. 今までの書き方で遅延初期化 class OrderController { private Logger logger = null; Logger

    getLogger() { if (logger == null) { logger = Logger.create(OrderController.class); } return logger; } ... }
  4. 今までの書き方で遅延初期化 欠点 - getLogger() を経由しないと NullPointerException が発生する - マルチスレッドの場合、複数回 Logger.create()

    が実行される可能性が  ある - logger が絶対に変化しないと言い切れないので、最適化されない
  5. Lazy constantsの書き方 - java.lang.LazyConstant にあるファクトリメソッドの of を使用する - 一度初期化すると変更不可能になる class

    OrderController { private final LazyConstant<Logger> logger = LazyConstant.of(() -> Logger.create(OrderController.class)); ... }
  6. Lazy constantsの書き方 - logger.get() を呼び出した時に logger が初期化されていなかったら  LazyConstant.of() で指定した内容で初期化する class

    OrderController { ... void submitOrder(User user, List<Product> products) { logger.get().info("order started"); ... logger.get().info("order submitted"); } }
  7. Lazy constantsの書き方 - アプリケーション全体を通して初期化方法を再考することが可能になる  - 例) 各 Controller の初期化など class

    Application { static final LazyConstant<OrderController> ORDERS = LazyConstant.of(OrderController::new); public static OrderController orders() { return ORDERS.get(); } }