2008-08-23 123 views
104

Java中註釋的用途是什麼?我有他們的這種模糊的想法,在評論和實際的代碼之間的某處。它們在運行時會影響程序嗎?Java註釋

它們的典型用途是什麼?

它們是Java獨有的嗎?有沒有C++的等價物?

+9

你可以做一些真正邪惡的事情與註釋。例如,如果您知道Spring Framework及其@Transactional註釋,它在方法調用之前啓動事務並回滾異常/錯誤並提交成功事務。它完全支持SOC原則(關注點分離)。很乾淨 ! Java規則! :-) – 2012-11-16 17:37:21

回答

16

此外,它們是否是Java獨有的,是否有C++等價物?

不,但VB和C#有attributes這是同樣的事情。

它們的用途非常多樣。一個典型的Java示例@Override對代碼沒有影響,但編譯器可以使用它來生成警告(或錯誤),如果裝飾的方法實際上並未覆蓋其他方法。同樣,方法可能被標記爲過時。

然後有反射。當您在代碼中反映類的類型時,您可以訪問這些屬性並根據其中找到的信息進行操作。我不知道Java中的任何示例,但在.NET中,編譯器使用這些示例來生成(de)serialization關於類的信息,從傳統庫(等等)確定結構的memory layoutdeclare function imports。他們還控制IDE窗體設計器的工作方式。

/編輯:類的屬性與標記接口相似(如Java中的Serializable)。但是,.NET編碼準則說不使用標籤接口。此外,他們只在班級級別上工作,而不是在方法級別上工作。

12

安德斯給出了一個很好的總結,這裏是一個JUnit註釋

@Test(expected=IOException.class) 
public void flatfileMissing() throws IOException { 
    readFlatFile("testfiles"+separator+"flatfile_doesnotexist.dat"); 
} 

這裏@Test註解告訴JUnit的的一個例子是,flatfileMissing方法是應該執行的,並且預期的結果是一個測試拋出IOException。因此,當你運行你的測試時,這個方法將被調用,並且測試將通過或失敗,這取決於是否拋出了IOException

7

Java還具有Annotation Processing Tool(apt),不僅可以創建註釋,還可以決定這些註釋如何在源代碼上工作。

Here是一個介紹。

4

要看到一些很酷的東西,你可以使用註解做,檢查出my JavaBean annotations and annotation processor

它們非常適合生成代碼,在構建過程中添加額外的驗證,並且我還一直在使用它們來獲取錯誤消息框架(尚未發佈 - 需要用老闆清除......)。

0

通過字面定義,註釋將註釋添加到元素。同樣,Java註釋是我們插入源代碼中的標籤,用於提供有關代碼的更多信息。 Java註釋將信息與註釋的程序元素相關聯。除了Java註釋之外,Java程序還有大量的非正式文檔,通常包含在源代碼文件的註釋中。但是,Java註釋與註釋不同,它們直接使用註釋類型來註釋程序元素來描述註釋的形式。 Java Annotations以標準和結構化的方式呈現信息,以便通過處理工具使用它。

要詳細閱讀,對Java Annotations

0

關於EJB的註釋被稱爲選擇顯式中間件方法的隱式中間件方法,當您使用註釋來自定義您確實需要從API 中獲得例如您需要調用事務不使用註釋 :對於銀行轉賬方法 同時使用註釋你的代碼沒有笨重的API調用,以使用中等 器具服務的代碼將是

transfer(Account account1, Account account2, long amount)  
{ 
    // 1: Call middleware API to perform a security check 
    // 2: Call middleware API to start a transaction 
    // 3: Call middleware API to load rows from the database 
    // 4: Subtract the balance from one account, add to the other 
    // 5: Call middleware API to store rows in the database 
    // 6: Call middleware API to end the transaction 
} 

。該代碼是乾淨的,專注於業務邏輯

transfer(Account account1, Account account2, long amount) 
{ 
    // 1: Subtract the balance from one account, add to the other 
}