2016-03-11 45 views
4

我知道在java中基本註解像@OverrideJava的8重複定製註釋

Annotations are only metadata and they do not contain any business logic. 

我經歷從Oracle documentation頁重複註釋瞭解java-8新功能。

例如,您正在編寫代碼以使用timer service that enables you to run a method at a given time or on a certain schedule, similar to the UNIX cron service。現在,您要設置一個計時器,以在該月的最後一天和每週五下午11:00運行方法doPeriodicCleanup。要設置計時器運行,請創建一個@Schedule註釋並將其應用兩次到doPeriodicCleanup方法。

@Schedule(dayOfMonth="last") 
@Schedule(dayOfWeek="Fri", hour="23") 
public void doPeriodicCleanup() { ... } 

聲明一個可重複的註釋類型

註釋類型必須標明@Repeatable元註釋。下面的示例定義的自定義@Schedule重複註解類型:

import java.lang.annotation.Repeatable; 

@Repeatable(Schedules.class) 
public @interface Schedule { 
    String dayOfMonth() default "first"; 
    String dayOfWeek() default "Mon"; 
    int hour() default 12; 
} 

聲明包含註釋類型

含註釋類型必須與一個數組類型的值的元素。數組類型的組件類型必須是可重複的註釋類型。包含註釋類型日程表的聲明如下:

public @interface Schedules { 
    Schedule[] value(); 
} 

我不明白的@Schedules標註的使用和使用。現在如何爲以下方法工作?

public void doPeriodicCleanup() { ... } 

在此先感謝。

+0

爲什麼你需要重複註釋?在我看來,你可以在一個實例上擁有所有的屬性,然後找出屬性存在和省略的意圖。顯然有一些屬性組合是無效的,但你已經有了這種情況。 –

+1

只是我想了解oracle文檔頁面。這個例子已經從那裏引用。 –

回答

6

在Java 8之前,給定的註釋只能在方法(或類或字段等)上設置一次。因此,如果您希望能夠通過單一方法設置兩個不同的時間表,則必須定義一個「包裝」註釋,如Schedules,其中包含Schedule個註釋。

開發商因此不得不做這樣的事情:

@Schedules(value = { 
    @Schedule(dayOfMonth="last"), 
    @Schedule(dayOfWeek="Fri", hour="23") 
}) 

這不是很可讀,及附表批註沒有比包含幾個附表標註以外的任何目的。

爲了減少樣板,但保留註解API相同,它現在允許通過宣佈計劃爲可重複並指定其「包裝」的註釋與

@Schedule(dayOfMonth="last"), 
@Schedule(dayOfWeek="Fri", hour="23") 

簡單註釋方法。但它只是語法糖,與前面的代碼產生相同的結果:在運行時,該方法被視爲使用包含兩個Schedule的單個Schedules註釋進行註釋。編譯器將第二段代碼轉換爲第一段代碼。

+0

感謝您的信息。我只有一個小的查詢。現在我們應該在哪裏放置@Repeatable? –

+1

關於必須重複的註釋:Schedule。就像本教程解釋的一樣。 –

+0

oops。從我的結尾愚蠢的錯誤。 –