[英]Best practice for @Value fields, Lombok, and Constructor Injection?
[英]Named parameter constructor in groovy and lombok @Value
我有來自Lombok的@Value
注釋的跟隨對象:
@Value
public class Foo {
private final boolean bar;
private final boolean baz;
private final boolean boo;
}
我嘗試從groovy測試中實例化Foo
:
new Foo(bar: true, baz: false, boo: true)
但我收到警告:
Constructor 'Foo' cannot be applied to '()'
並在運行時跟隨錯誤:
Cannot set readonly property: bar for a class: Foo
有沒有辦法在groovy中使用命名構造函數,它將調用所有參數的構造函數,而不是調用空構造函數,然后嘗試設置字段?
Constructor 'Foo' cannot be applied to '()'
出現這種情況是因為類中的所有字段都是final,因此您必須在對象初始化期間啟動這些字段。
因此,創建此類對象的唯一方法是使用all-args構造函數:
new Foo(true, false, true)
由於這種方式,Groovy處理看起來像命名的參數(Groovy 不支持命名參數 - 它傳遞Map),這也將失敗與類似的Groovy代碼。 Groovy處理地圖傳遞的方式是將地圖展開到setter調用中(並且沒有因為屬性是final的)。
@groovy.transform.TupleConstructor
class Foo {
final boolean bar
final boolean baz
final boolean boo
}
new Foo(bar: true, baz: false, boo: true)
失敗了
Caught: groovy.lang.ReadOnlyPropertyException: Cannot set readonly property: bar for class: Foo
groovy.lang.ReadOnlyPropertyException: Cannot set readonly property: bar for class: Foo
at x.run(x.groovy:8)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.