經過一堆XML配置文件之後,我看到Java轉向基於Annotation的配置。註釋是否是Java中的某種DSL?
註釋在這裏扮演着DSL的角色嗎?
是因爲Java的靜態性質嗎?我在Ruby中思考沒有(afaik)這樣的事情。是否因爲Ruby具有良好的元編程功能?
是否有替代品(我的意思是不是用一堆.xml文件等)
經過一堆XML配置文件之後,我看到Java轉向基於Annotation的配置。註釋是否是Java中的某種DSL?
註釋在這裏扮演着DSL的角色嗎?
是因爲Java的靜態性質嗎?我在Ruby中思考沒有(afaik)這樣的事情。是否因爲Ruby具有良好的元編程功能?
是否有替代品(我的意思是不是用一堆.xml文件等)
基本上註釋是一種工具,讓您可以處理在編譯時的源文件,並做相應的動作,以找到註解該文件(可能導出一個新的來源)。
它們對於許多目的非常有用,例如解釋約束,同時避免混淆代碼或豐富某些方法的行爲。
我不會說他們與Ruby的DSL很相似,因爲在這種情況下,您可以使用特定的語法對代碼進行註釋,而在Ruby中,您可以根據需要設計自己的DSL並根據需要使用它。
的Java附帶一個工具,稱爲apt
(如你懷疑的),能夠同時在運行時與註釋工作,但他們通常使用給編譯時的相關信息,以你的源代碼。這並不意味着在某些情況下,您不能輕易調整註釋機制來制定出與DSL所獲得的內容相同的內容,但它們並不是爲了相同的目的而存在的。
如前所述,註釋可用於非常高效地創建DSL,因爲它們爲語言添加了某種元編程功能。但是爲了這個目的,你可以使用字節碼注入器,甚至任何其他的Java語言特性。 然而,註釋的主要目的是能夠使用元數據註釋源代碼元素。 如果您要求使用Java創建內部DSL的替代方案,只需查看Fowler's DSL book WIP並從可用於實施內部DSL的不同概念中進行選擇,其中許多概念都以Java存在。如果您正在尋求元編程的替代方案,那麼還有很多:不同的字節碼注入器,使用AspectJ或Spring或代碼生成的面向方面編程。
我不認爲這是完全準確的說,註釋通常用於編譯時處理。我認爲最近註釋的主要用途是作爲元數據,允許在運行時完成有趣和有用的事情。 – ColinD 2010-07-13 16:59:51
我正在談論他們出生的原因。現在這個概念已經被廣泛的擴展,以克服Java語言的缺陷:)但是我不會說他們涵蓋了DSL的目的..你會嗎? – Jack 2010-07-13 17:03:50
什麼是替代方案(通常在編譯的編程語言中)? – OscarRyz 2010-07-13 17:17:53