コードによって表現されているものには条件判断するためのデータがあり、ループするためのデータがあり、フロー制御するためのデータがある。それらのデータは外部から与えられる場合もあるが、コードに内在している場合もある。言えばコードはそれ自体がデータだ。コードは振る舞いを持ち独自のデータを持つ。オブジェクトの要件をある程度まで満たしている。Javaの場合コードそのものにはアイデンティティが無い。このため、コードはそれだけではオブジェクトとして扱うことはできない。言い換えると、Javaではコードはメソッドとして実現されているからそれ自体をインスタンスとして扱うことはできない。あるクラスのインスタンスのメソッドとしてはじめてインスタンス化される。コードそれ自体は本来的にスタティックであるがオブジェクトの多態性(交換可能性を満たすために必要)を実現するためには、インスタンスメソッドとして実装する必要がある。まとめるとこのようにして実装されたコードにとってクラス#メソッドシグネチャがアイデンティティなのでスタティックメソッドでも良いのだが、さらにストラテジとして(多態に)扱えるようにするにはスタティックではなくインスタンスメソッドとしなければならない。可変なパラメータは外部からメソッド呼び出し時に与えることが可能なためシングルトンでよいことになる。f.bar();}...として扱うことができるFooのインスタンスはもちろんオブジェクトだということだ。...}ならOOではなく「シングルトンいくない」というようなことを言い出すとしたらそれは森を見ていないことになる。メソッドをオブジェクトとして扱うということが理解できていないかだ。FooImpl2のシングルトンの取得...となり、個々のインスタンス毎に振る舞いとデータを持ったオブジェクトとして動くからだ。Javaの表現としてはメソッドをオブジェクトとして扱うためには単一のクラスとそこから生成される複数のインスタンスではなく、複数のクラスによるそれぞれのインスタンスとなるということである。まとめるとビジネスロジックというのは、それ(ビジネスロジックを提供するメソッド。クラスではなく)自体が抽象度が高いオブジェクトである。それをJavaで実現するには、シングルトン(ロジカルにはそのクラスの複数のインスタンスを作成する意味はない。このクラスはメソッドを提供すること以外に意味がないからだ)が良く(同一アイデンティティのオブジェクトが複数生成されるのは気味悪いでしょという感覚的な理由と、生成コストがまったく無駄になるという現実的な意味の両方から)、外部から与えられるパラメータと必要に応じて処理中に利用される外部のエンティティにのみ影響を与えるのだからステートレスであるべきだということになる(実装の都合でインスタンス変数を複数の内部的なメソッドでの共有資源としてグローバルに扱う必要がゼロになるとは言わないが、意味的にはインスタンス変数は不要である。コードそのものにデータがあるからだ)。