今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

Use your singletons wisely(英語)

TECHMemoで紹介された developerWorks の記事。developerWorks で日本語に訳されたのを探したが、残念ながら見つからなかった。
この記事の「When it really is a singleton」という節で、あるクラスが Singleton であるべきかどうかを判断する方法を述べている。

あるクラスが本当に Singleton かどうかを判断するには、次の質問に自問自答する必要がある。
・すべてのアプリケーションが「厳密に」同じ方法でそのクラスを使うのか?
・すべてのアプリケーションにおいて、そのクラスのインスタンスが「ひとつ」であることが「必須」なのか?
・そのクラスのクライアントは、アプリケーションを全く意識せずにすむか?
この3つの質問に対する回答がすべて「Yes」ならば Singleton だ。クラスが Singleton であることのキーポイントは、すべてのアプリケーションがそのクラスを厳密に同じものとして扱えることと、アプリケーションのコンテキストとは関係なくそのクラスを利用できることだ。

誤訳があったら教えてください。
よほど普遍的なクラスでない限り、この条件をすべて満たすことはないと思うが、実際のところどうだろう。そもそも、この条件を満たしている時点で、Singleton にしなくてもいいように思う。(もしかするとそれを狙って書かれた記事?)
Singleton の代表例として、java.lang.Runtime があるが、このクラスのメソッドを見てみると、インスタンスがひとつじゃなきゃいけないってわけでもなさそうだ。ソースを見ても、Singleton である必要性はないようにみえる。Runtime が複数あるのも変に感じるから、「感覚的」に Singleton を使ったのだろうか?
私自身、今までにいくつか Singleton を作ってきたが、全部2番目の条件に合わない。作った当時は Singleton にすれば他のクラスから参照するのが簡単だからと言う理由だった。多分、大半の Singleton はこういう動機で作られているのではないかと思う。
そのような場合は引数で渡してやるのが適切なのに、それがめんどうなので手を抜いて Singleton にしてしまう。
本当は、そこをうまく設計するのが腕の見せどころだ。