2016-04-21 62 views
1

我知道there is no java annotation inheritance。但是有可能在java中做類似的事情嗎?java註釋組成

@TopAnnot({ 
    @SubAnnot("value1"), 
    @SubAnnot("value2"), 
    @AnotherSubAnnot("value3"), 
    @SubAnnot("value4") 
}) 
public void aMethod(String param) { ... } 

@SubAnnot的順序和@AnotherSubAnnot是很重要的。

因此,下面的解決方案,將不具有相同的含義,因爲我不能保持註釋的順序:

@TopAnnot(
    subAnnot = { 
     @SubAnnot("value1"), 
     @SubAnnot("value2"), 
     @SubAnnot("value4") 
    }, 
    annotherAnnot = { 
     @AnotherSubAnnot("value3") 
    } 
) 
public void aMethod(String param) { ... } 

另一種解決方案應該是下面的,但它是更爲複雜寫,不太容易理解:

@TopAnnot({ 
    @MyAnnot(type=AnnotType.SubAnnot, value = "value1"), 
    @MyAnnot(type=AnnotType.SubAnnot, value = "value2"), 
    @MyAnnot(type=AnnotType.AnnotherSubAnnot, value = "value3"), 
    @MyAnnot(type=AnnotType.SubAnnot, value = "value3") 
}) 
public void aMethod(String param) { ... } 

有沒有更簡單的解決方案?

回答

0

您可以使用Java 8 repeating annotations添加一些可讀性,但這不會解決實際問題。它仍然使用只保留每種類型聲明順序的容器註釋。所以你可以使它看起來像第一個例子,但是你仍然不知道運行時的實際順序。

@SubAnnot("value1"), 
@SubAnnot("value2"), 
@AnotherSubAnnot("value3"), 
@SubAnnot("value4") 
public void aMethod(String param) { ... } 

我認爲在運行時沒有很好的解決方案。如果您有權訪問源代碼,那麼應該可以在編譯時獲得聲明的順序。

如果您需要在運行時的解決方案,你可能要麼在你的榜樣使用type場像或添加其他字段明確聲明的順序,例如:

@SubAnnot(id=1, value="value1") 
@AnotherSubAnnot(id=2, value="value2")) 
@SubAnnot(id=3, value="value3")