-アノテーションの継承

超Aptによって実現するカスタムメタアノテーションとサポートフレームワーク(Ikushipe)によって、アノテーションに擬似継承機能を作れないか考えています。

@PageModel
public interface LoginModel {
  @Property
  @LengthValidator(min=1, max=6)
  String getUserId();
}

ユーザーが実装するアノテーションである、LengthValidatorはフレームワークが用意するカスタムメタアノテーションValidatorを利用して、継承っぽく、かつジェネリックス風なつくりをする

// 心はT extends Validator。
@Retention(RetentionPolicy.RUNTIME)
@Validator(MyLengthValidatorImpl.class)
public @LengthValidator {
  int min() default -1;
  int max() default -1;
}

値検証の実体であるLengthValidatorImplはPOJO。VariableとExecuteというフレームワーク提供のアノテーションで動作。抽象クラスの場合、フレームワークバイトコードエンジニアリング等でエンハンスする。

public abstract class MyLengthValidatorImpl {
  @Variable
  public abstract int getMin();  
  @Variable
  public abstract int getMax();  
  @Execute
  void myExecute(Object value, Locale locale)
  throws Exception {
    int min = getMin();
    int max = getMax();
    if(MyUtil.checkLength(min, max, value) == false) {
      throw new MyLengthError(min, max, value,locale);
    }
  }
}

出来れば有効な気がします。