2014-04-23 39 views
2

其實,我通過新的東西在Java中8要去有很多新的東西來了,即Lambda表達式,默認的方法和這麼多..什麼是真實情況下使用重複註釋?

其中一個功能是重複批註,

「重複註釋提供了將相同註釋類型多次應用於相同的聲明或類型用途的能力」

這裏我可以理解,我可以多次使用相同的註釋。

我想了解這個加法的實際/實際用法。並試圖理解爲什麼他們錯過了它,直到Java 7中

回答

5

如果你有,例如,一些基於角色的安全性,你可以寫類似:

@Authorize(role="USER") 
@Authorize(role="ADMIN") 
public void doStuff(){ 
...codez 
} 

在以前的Java版本,達到同樣的,你必須做一些事情,如:

@Authorize(roles={"USER", "ADMIN"}) 
public void doStuff(){ 
...codez 
} 

@Authorize(role="USER, ADMIN") 
public void doStuff(){ 
..moar codez 
} 

的如你自己所看到的,差異很小,而@Repeatable註釋比一個巨大的突破更具語法糖。好處不明顯,除非你考慮一些更詳細的註釋,比如一堆Quartz cron表達式。在此之前的Java 8,你必須做一些事情,如:

@Cron(values={"* * * * * 10", "12 * * * * 0", "4 * 5 * 6 * 7"}) 
public void doCron(){ 

} 

但在Java 8,你可以有每行一個單獨的cron,這使得表達式更具可讀性。

+0

我們也可以寫這些爲 @Authorize(角色=「管理員,用戶「) public void doStuff(){ ... codez } –

+0

我們可以用多種方式編寫所有內容。Java 8增加了一種新的編寫方式。想象一下,如果不是角色,你有一堆石英克隆表達式。如果每個人都在單獨的線路上,那將會更好。但是再一次,Repeatable增加了java8,更像是一個語法糖,而不是從設計角度思考的東西。 –

2

答案很明顯:你想用多個值來註釋某些東西。

此前此功能,您就需要解析單個參數允許在你的註釋處理代碼:

@SomeAnnotation(value="this,that") 
String foo; 

或(從評論):

@SomeAnnotation(value={"author1","author2"}) 
String foo; 

註釋處理代碼需要有邏輯來處理分裂價值和處理價值,或獲得多重價值。允許多個註釋使得從邏輯角度來看更簡單。這只是便利功能。

+0

http://stackoverflow.com/questions/20632940/how-to-set-string-array-in-java-annotation –

+0

@baba同樣的交易。處理相同類型的多個註釋更簡單。我編輯更清楚這只是一個便利功能。 –

7

當您在註釋中聲明瞭多個字段時,這非常有用。例如:

@Repeatable 
public @interface Role { 
    String type; 
    String[] allowed; 
} 

在這種情況下,它是非常容易使用這種註釋了多重角色:

@Role(type="readonly", allowed={"view"}) 
@Role(type="admin", allowed={"view,add,update,delete"}) 
public boolean checkAllowed() { 
} 
+0

這是不正確的,你不能將沒有包裝類的'@ Repeatable'定義爲值。 –

相關問題