Wednesday 27 December 2017

Java の Singleton

昔、学生に書いてもらった Alice っていう分散フレームワークなんですが、

  Task scheduler とかが Singleton

ぐ。おかげで、

  Java で複数 Thread でテストする

ってのが不可能。手元で InteliJ でデバッグできないです。Nat だとつなぎ先を複数用意しないといけないのだが、それもできない... さらに、

  Java は fork できない

おおい。逃げ道ないんですけど。複数プロセス上げても、そこに何かを渡すには引数とか共有メモリとかめんどくさい... Thread local は遅いし、さらに混乱するだけ。

そして、残念ながら、

  Singleton の除去は自明でも簡単でもない

DIコンテナみたいに必要なものをそろえて渡してやれば良いだけなんですが、Singleton で書いたが最後、

  便利なので、どっからでも自由にアクセス

ということになってるので、まず、使用しているところを洗い出して、そこに渡す手段を作成時に用意するという作業が...

というわけなので、

  どうせなら書き直した方がまし

ってな状況です。

DBコネクションとか Logger とかは Singleton にしろとか言っている人もいるようですが、

  マルチCPU以前の古い常識

でしかないですね。単純に static を使った Singleton は禁止だと思う。

インスタンスが一つという状況はもちろんあるわけですが、それを大域変数で自由にアクセスってのは、Logger でももうないです。Haskell みたいに原理的に書けない言語とかもあるし。

No comments: