インターフェイスかアノテーションか、それとも規約か

フレークワークが特定の状況下でユーザクラスのインスタンスにメッセージを通知したい場合、ユーザクラスに何らかの形で「印」を付けることを強制して、どのメソッドを呼び出すのか決定する必要があります。その「印」として考えられるのは、基本的に次のいずれかです。

  1. 特定クラスの継承
  2. 特定インターフェイスの実装
  3. 特定のアノテーションを付加したメソッドの実装
  4. 特定のシグネチャを持つメソッドの実装

1はStrutsのActionなどですが、これはまあ論外ということで。

POJO全盛の現在では、アノテーションを使う3の方法が流行していると思います。EJB3のライフサイクルメソッド用アノテーション(@PostConstructなど)が好例ですね。Urumaにも@InitializeMethodがあります。

アノテーションさえも嫌って、さらにPOJO志向を押し進めたのが4の方法です。Teedaのinitialize()とprerender()がこれですね。

で、僕としては、本来の言語仕様に回帰して2を選びたいです。「フレームワーク固有のインターフェイスを実装させるとフレームワーク依存になってしまう」という抵抗感もあると思いますが、それはアノテーションでも同じことだし、implements句を除去するだけで非依存に戻せるので問題ないかなと。

4は「見えないインターフェイス」を実装させているようなもので、負担がコンパイラから開発者に移っているような気がします。

追記

フレームワークの処理対象が名前情報を持っており、その名前情報とメソッドを綺麗にマッピングできるケースでは、4の方法が有効になると思います(TeedaのdoXxxメソッドなど)。