2016-04-21 63 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")