2012-09-06 3 views
4

주석 내부에 메타 데이터 구조를 만드는 데 문제가 있습니다. 우리는 Hibernate 엔티티 속성을위한 특수 속성을 정의하기 위해 주석을 사용하고 있지만 모든 곳에서 사용할 수 있습니다. 나는이 구조 표현 조건 만들려면 :Java annotation의 계층 구조

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

문제는 내가이 주석을 사용하여 일부 "트리"구조를 정의 할 필요가입니다.

public class Table { 

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

} 

내가 주석 정의에 정의 된 방법으로 상속이 위 알고 :이 예에 따라 사용할

@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 {}; 
} 

이러한 모든 주석 : 여기에 도달 할 몇 가지 디자인이다 불가능합니다. 하지만 내 주석을 고려하고 OR을 하나의 "가족"에 포함시킬 수 있습니까?

답변

5

Why it is not possible to extends annotations in java?

확인하지만 당신은 주석의 그룹을 만들 주석을 사용할 수있는 메타 주석을 만들 수 있습니다하십시오.

하지만 두 번째 문제와 관련하여 도움이되지 않습니다. 부모로 LogicalExpression을 사용하십시오.

하지만 다음과 같이 할 수 있습니다. LogicExpressionenum으로 선언하십시오.이 방법을 사용하면 enum이라는 싱글과 Attributes의 다양한 세트를 사용하여 조건을 실행할 수 있습니다.

당신이 AND, OR 조건을 실행하고자하는 경우에 당신은 LogicExpression.AND, LogicExpression.OR를 통과하고이 불행하게도 나에게 도움이되지 않습니다

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 {};.. 
} 
+0

AND 조건을 실행하기 위해 OR 상태와 andAttributes()을 실행하는 orAttributes() 방법을 사용할 수 있습니다. 일반 LogicalExpression 목록을 통해 구조를 정의해야하지만 특정 AND 또는 OR 또는 NOT 또는 다른 표현식을 사용해야합니다. –

+0

답변을 업데이트했습니다. 귀하의 목적을 확실히 충족시킬 것으로 생각합니다. –

+0

좋은 생각이지만 여전히이 솔루션에는 자체 한계가 있습니다. 그러나 당신의 솔루션은 나에게 또 다른 아이디어를 가져다 준다 - 나는 그것을 NODE 형태로 구현할 수있다. 노드에는 현재 레벨에 적용된 논리 표현식의 유형과 속성 목록 및 하위 노드 목록이 포함됩니다. –