4

アノテーション内にメタデータ構造を作成する際に問題が発生しています。Hibernateエンティティ属性の特別な属性を定義するためにアノテーションを使用していますが、どこでも使用できる可能性があります。これらの構造を表す条件を作成したいと思います。

attribute1 = ...
OR
  (attribute2 = ...
   AND
   attribute3 = ...)

問題は、このアノテーションを使用して「ツリー」構造を定義する必要があることです。これが私が到達したいいくつかのデザインです:

@interface Attribute {
  ... some attributes ...
}

@interface LogicalExpression {
}

@interface OR extends LogicalExpression {
  Attribute[] attributes() default {};
  LogicalExpression logicalExpressions() default {};
}

@interface AND extends LogicalExpression {
  Attribute[] attributes() default {};
  LogicalExpression logicalExpressions() default {};
}

@interface ComposedCondition {
  Attribute[] attributes() default {};
  LogicalExpression logicalExpressions() default {};
}

この例に従って使用したいこれらすべての注釈:

public class Table {

  @ComposedCondition(logicalExressions = {
    @OR(attributes = {@Attribute(... some settings ...)}, 
        logicalExpressions = {
          @AND(attributes = {@Attribute(...), @Attribute(...)})
        })
  }
  private String value;

}

上記のアノテーション定義で定義した方法での継承は不可能であることを私は知っています。しかし、注釈をAND、ORを1つの「家族」に含めるにはどうすればよいでしょうか。

4

1 に答える 1

5

Javaでアノテーションを拡張できない理由を確認してください。

ただし、注釈に使用して注釈のグループを作成できるメタ注釈を作成できます。

    @LogicalExpression
@interface OR {
    Attribute[] attributes() default {};
    LogicalExpression logicalExpressions() default {};
}

しかし、これはあなたの2番目の問題、すなわちあなたを助けません。LogicalExpression親として使用します。

しかし、あなたは以下のようなことをすることができます。このように宣言LogicExpressionすると、enum 単一enumのさまざまなセットを 使用Attributesして条件を実行できます。

たとえば、条件を実行する場合は、を渡すことができ、メソッドを使用して条件を実行しAND、条件を実行することができますORLogicExpression.ANDLogicExpression.ORorAttributes()ORandAttributes()AND

public enum LogicExpression {
OR,AND,NOT;
}


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface ComposedCondition {
LogicExpression[] getExpressions() default {};
Attributes[] orAttributes() default {};
   Attributes[] andAttributes() default {};..
}
于 2012-09-06T06:52:23.350 に答える