簡體   English   中英

在groovy和lombok @Value中命名參數構造函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM