EJB3.1はかなり良さげ - Interfaceは必要か??

 世に出回ってるDIフレームワーク(コンテナ)のほとんどはInterfaceの定義がほぼ必須となってます。Interfaceを定義せずともInjection可能なDIコンテナはありますが、例えばトランザクションの制御を行いたい場合等はフレームワーク側でProxy用のオブジェクトを生成するためにそのオブジェクトの親であるInterfaceがやはり必須になったります。

 その事によりトランザクションの制御を宣言的に行えることのメリットはエンタープライズ系のシステムを構築する際には計り知れない恩恵を受けるわけですが、自分の中で常に「これってInterface必要なの??」という疑念が常に存在してました。

追記(11/16):上記部分に関してご指摘を頂いたのでコメントアウトしました。

 現在一般的に言われる「Serviceクラス(オブジェクト)」はDIコンテナを使用する際には、ほぼ間違いなくInterfaceと実装クラスが1対1だと思います。そこにもどかしさを自分は感じてました。本来Interfaceは『振る舞い』を定義するものであり、それを実装するサブクラスが複数あることで始めて威力を発揮します。それがつまりポリモーフィズムでありオブジェクト指向であったりと思うわけです。

 とあるDIコンテナの技術本には「Interfaceを常に意識することでより良い設計が可能になる」とか書いてあったのを見て『いや、本質ずれてるっしょ。だって実装クラスと1対1だし』とか思ってました。「Unit Test時にモックオブジェクト作りやすい」という意見も聞いたことがありますが、その場合は実装クラスのサブクラスを作成し、テストしたいメソッド以外ではUnsupportedOperationExceptionをThrowすればいいと思うのです。

 そういう考えでいたものでEJB3.1のInterfaceがオプション化されたことは個人的に凄く嬉しいですねぇ