アノテーション指向プログラミングの苦悩

現在のJava界隈の主流な流れとしてアノテーションベースのプログラミングがあげられる。


これはCoC(Convention Over Configration)プログラミングの問題点を回避したいという意図も含まれる。


CoCの主な問題点は以下のとおり。
・タイピングミスによる静的エラーの検出ができない点(トレーサビリティの低下)
命名のみの属性しか表現できない点
・例外が発生した場合の回避策がない点(隅々まで網羅した十分な設計が要求される)


ところで、アノテーションベースで開発がさらに容易になるかどうかはいささか疑問点が残る。現在はさまざまなライブラリ・フレームワークにおけるアノテーション仕様が整備されてきており、それに伴う学習コストが徐々に高まりつつあるのは否めない。おそらく、簡単なアノテーション仕様ならば導入可能だが、少しでもアノテーションで難しいことをすると途端に学習コストがかかり四苦八苦するだろう。


アノテーションも結局は設定であり、設定の書き方について学習コストが発生することは避けられないのかもしれない。


他にも、とりわけ考慮されていないことが、アノテーションの実装が今後のJavaバージョンアップで下位互換を保てるかどうかである。アノテーションはあくまでもメタ情報、設定情報であり、言い換えると、これは書き換えられるという機能をソースに付加したということになる。


書き換えられるということは逆に考えると今後も変更が発生するということになる。それゆえ、今後の仕様変更に柔軟に対応できる設計が求められるのだが、残念ながら現在のアノテーションの仕様ではそこまで充実していないのが現状だ。そもそもアノテーションとOCP(Open Closed Principle)は残念ながら離れた座標に位置していると言わざるを得ないだろう。


さらに、アノテーションを使用するフレームワークが最盛すると、ソースはアノテーションで埋め尽くされる。これらに対する回避策も今後必要となってくるだろう。


暫定的な回避策ではないが、アノテーションに対し、以下のような書き方をすることで、アノテーションを付与する対象を一括変更したり、付与するしないをフレキシブルに設定することができる。

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

/**
 * <i>概要(abstract)</i>: サンプルアノテーション
 * .<p>
 * サンプルアノテーション
 * 
 *
 * @author  kensir0u
 * @version 1.0
 * @since   JDK 5.0
 *
 */
@Target(Targets.getElementTypes()) //Targetsクラスの設定
@Retention(RetentionPolicys.getRetentionPolicy()) //RetentionPolicysクラスの設定
public @interface A {}



//RetentionPolicys 
public final class RetentionPolicys {
	
	private RetentionPolicys(){}
	public static RetentionPolicy getRetentionPolicy() {
		return RetentionPolicy.RUNTIME;
	}

}
//Targets 
public final class Targets {
	private Targets(){}
	public static ElementType[] getElementTypes(){
		return new ElementType[]{ METHOD, FIELD, ANNOTATION_TYPE };
	}	
}