ソフトウェアエンジニアに大切なこと

プログラミングという名の魔法

Java初心者はstatic使うな!

ジュニアエンジニアのソースコードをレビューしていてよく思うことは 「よくわかってないのにstatic使うんじゃねえ!」

staticが危険なのは複数スレッド間で共有されるという点です。 thread-safeという言葉が密接に絡んできますね。

では具体的に何が問題か? thread間で共有されるとどういう現象が起こるか、と考えるとわかりやすいですね。

たとえば、thread1からあるオブジェクトを「変更している間」にthread2から参照するとき、「変更されつつある中途半端なオブジェクト」が参照される可能性があります。

 Javaは高速ですが、時間を無視して動くわけではありません。 操作には必ずその実行時間が存在します。

これ系で有名なのはSimpleDateFormatですかね。 ご存知なければググってもらえるとわかりますが、thread-safeでないためこの問題が起こり得ます。 ちなみにthread-safeでない旨はjavadocに書いてます。

staticを使用することでnewするコストを省けるのは確かなんですが、個人的にはstaticによるチューニングは後回しでいいと思います。

それよりも、よりバグの少ないプロダクトを作るほうが重要。 しかもstaticが原因のバグはマルチスレッド関係なので検証しづらいですね。

そんなわけで、そもそもマルチスレッドやthread-safeという言葉を理解していない初心者にはstaticを使わせないのが無難です。

staticを使わずを得ない状況では、共有するオブジェクトが本当にthread-safeか、マルチスレッド処理を理解してるメンバーがサポートする必要があるでしょう。