グーグルはバイトコード内におけるシングルトン上での発見と報告をするためのバイトコード分析をするツールを発表した。シングルトンは一般的なソフトウェアパターンであるがそれに対してたくさんの人が慎重に物議をかもしており、意見は賛否両論となっている。プロジェクト用wikiには下記のように述べられている。
シングルトンの問題は誰もがいつでもアクセス可能にしつつグローバルステートをプログラムに引き合わせていることだ。更に良くないことにシングルトンは今日一番酷使されているデザインパターンの一つであり、必要性さえもない実例においてたくさんの人がこの有害なグローバルステートを取り入れる可能性があることを意味しているのだ。
グローバルステートを使用しているプログラムをテストするのはとても困難なことなのだ。
一つのクラスがシングルトンを使用すると(スタティックなgetInstanceメソッドを使って自身の単一性を強要するクラシックなシングルトンに関して話しています。)シングルトンユーザーとシングルトンは大変強力に結びつくのだ。
この静的インスタンスに依存するということはメソッドのシグネチャがもはやその依存性を提示していないということを意味している。なぜならそのメソッドは何もない状態からシングルトンを引き出すことができるからだ。
シングルトンに依存するとメソッドの依存性が明確にならないので、テスターは知らぬうちにシェアードリソースを修正することによって実は互いに依存しあっている二つのテストを作ってしまうかもしれない。
グーグルシングルトン発見器は自身の単一性(シングルトン)や、もう一つのクラス(ヘルパーシングルトン、またはヒングルトン)の単一性を強調するコードやパラメータ(メソッドシングルトン、またはミングルトン)なしでスタティックメソッドからステートを変換したり、またパブリックスタティックフィールド(フィールドシングルトン、またはフィングルトン)を持ち合わせているコード、また同様に上記で述べた中の一つに直接的に依存しているコードを発見することができるのだ。
もし興味がなかったら何個か隠しても良いだろう。
だがしかしこのツールはまだ初期段階にあるのでいくつかの制限がある。
- 最初に抽出を行わないと複数のJARファイルからバイトコードを読むことができない。
- グラフの結果を閲覧するのに外部ツールが必要となる。
- 全ての種類のシングルトン、特にインナークラスとして重ねあわされたシングルトン、またはファイナルフィールド内のシングルトンを発見することはできない。
今後のコードアナリシス、アーティファクト、ツール、そしてグーグルに関する情報に関してはInfoQを見てほしい。