2023.07.11staticイニシャライザの話SHARESHARECONTENTこんにちわ。2023年も折り返しあっという間にサマーシーズンですね。今回はJavaのお話になります。main()...みたいなおまじないが出てくるかと思います。今回はこのstaticを利用すべきケースとすべきではないケースについて、実際の開発を例に説明したいと思います。郵便番号などの体系チェックを行う共通部品を作成する場合とある変数に体系をプールする変数を用意して画面に入力された値が、問題ないかどうかをチェックする機能を実装する場合に、この共通部品のコンストラクタをstatic(staticイニシャライザ)にすべきか否か?■static変数にした場合のメリットstatic変数のメリットとしてインスタンス化の必要がないというのがメリットとなる為、本部品が使われれば使われるほど効果を発揮します。一日に10,000人のユーザが同機能を平均3回動かしにくる場合に、30,000回インスタンス処理が走る事になりますが、staticイニシャライザにしていた場合、そのシステムでアプリケーションが起動した後の最初の一人だけがインスタンス生成処理を行う事となり、残りの29,999回は既にインスタンス化された変数を呼び出すだけとなり大きくパフォーマンスに寄与します。■static変数にした場合のデメリットメリットの部分でいい事づくめのように感じたかと思いますが危険な側面もあります。万が一、最初に呼び出した際にDBの一時的な瞬断やパケットロスなど、レアケースではあるもののインスタンス化に失敗した場合はシステムを再起動しなければ、永遠にその機能(共通部品)はnullpointerでエラーを出し続ける事となり、復旧のためにシステム停止を余儀なくされます。static変数はあまり使わない方が良い!という話は正しい面もありますが、上記のように利用する事によるメリ/デメを評価して最適に利用していくのがお勧めです。ちなみに私見ですが、今回例を出したケースだと、インスタンスにかかる時間がそこまで重くなければレアケースとはいえデメリット面のインパクトが大きいと感じる為、staticは採用しませんかね。(30,000リクエストを多いと見るか少ないと見るか、何Msecを重くないと見るかも別途判断が必要な所ですが。)システムの規模や利用シーンによってどの方式を採用するかは永遠の課題なので、日々精進して参ります。