2012-09-06 66 views
4

我在創建註釋中的某些元數據結構時遇到問題。我們使用註釋爲hibernate實體屬性定義特殊屬性,但它可能在任何地方都可用。 我想創造出代表這些結構條件:java註釋中的類型層次結構

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; 

} 

我知道這樣,我在註釋定義定義繼承以上不可能。但是,我怎麼能考慮我的註釋,或者是否在一個「家庭」?

回答

5

請檢查Why it is not possible to extends annotations in java?

但是你可以創建可在標註可用於創建註釋的組元註解。

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

但這不會幫助你解決你的第二個問題。作爲父母使用LogicalExpression

但是你可以做下面的事情。聲明LogicExpressionenum這樣,您可以使用單個enum和各種組Attributes執行條件。

例如如果你想執行ANDOR條件,那麼你可以通過LogicExpression.ANDLogicExpression.OR和使用orAttributes()方法來執行OR條件和andAttributes()執行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 {};.. 
} 
+0

這不幸的是沒有幫助我。我需要通過一些常規的LogicalExpression列表來定義結構,但是使用特定的AND,或者NOT或其他表達式。 –

+0

更新了答案我認爲這絕對能滿足你的目的。 –

+0

這是個好主意,但這個解決方案仍然有其自身的侷限性。但是你的解決方案給我帶來了另一個想法 - 我可以用NODE的形式實現它。節點將包含應用於當前級別的邏輯表達式類型以及屬性列表和子節點列表。 –