2011-07-10 28 views
1

Groovy自動生成獲取者和設置者,例如當我輸入:如何將註釋放在由Groovy編譯器自動生成的getter或setter上?

int someField 

我得到的字段+ getter + setter。現在,我想提出一個註解的setter方法(如@需要從GContracts /確保):

@Ensures({someField >= 0 && someField <= 100}) 
int someField 

然後我得到錯誤:註釋groovy.lang.GrUnit是不允許的元素字段 - GrUnit和GContracts認識僅在方法上註釋。對此的解決方法是明確地編碼getter:

@Requires({...}) 
void setSomeField(int newValue) { ... } 

是否有更好的解決方案呢?在斯卡拉這裏有一個優雅的解決方案:http://www.scala-lang.org/api/current/scala/annotation/target/package.html

Groovy中是否有類似的東西?或者,也許:GContracts可能有一些解決方法來允許此類註釋?

回答

2

如您所知,GContracts不提供字段註釋(當前版本:1.2.4)。它甚至不會對GContracts運行前可能添加的合成(生成)方法執行AST轉換。

簡而言之:一個簡單的解決方法是添加自定義setter方法。另一方面,如果您要使用@Invariant保持類不變的註釋類,它將預先生成所有屬性的setter方法,以在執行setter方法之前和之後檢查類不變量。這就是說,在這個過程中考慮包括@Requires和@Ensures可能是值得的 - 我創建了一個問題:http://gcontracts.lighthouseapp.com/projects/71511-gcontracts-core/tickets/32

4

Groovy編譯器有9個編譯階段。 getters和setter在編譯階段產生得非常晚,並且在GContracts運行後生成。

如果你想讓你的代碼看起來好像生成的getter/setter被註釋了那樣,那麼你必須自己生成getter/setter對併爲它們註釋。具體而言,將兩個新的FieldNode添加到ClassNode(只要它們不存在)。一個字段節點是一個AnnotatedNode,所以你可以添加你想要的任何註釋。只要您在之前階段執行此操作,那麼G合同應該永遠不會知道其中的差異。

這就是說,這聽起來像是GContracts功能請求。

相關問題