Llamado parámetro de constructor en el maravilloso y Lombok @Valor

pixel:

He anotado con objeto siguiente @Valuede Lombok:

@Value
public class Foo {
    private final boolean bar;
    private final boolean baz;
    private final boolean boo;
}

Trato de crear una instancia Foode prueba maravilloso:

new Foo(bar: true, baz: false, boo: true)

pero me da advertencia:

Constructor 'Foo' cannot be applied to '()'

y durante el tiempo de ejecución de error siguiente:

Cannot set readonly property: bar for a class: Foo

¿hay una manera de utilizar el constructor nombrado en maravilloso que llamará constructor con todos los argumentos en lugar de llamar constructor vacío y luego tratar de campos de conjunto?

Alex:
Constructor 'Foo' cannot be applied to '()'

Esto aparece porque todos los campos de su clase son finales, así que hay que iniciar estos campos durante la inicialización del objeto.

Así que la única manera de crear un objeto de esta clase es utilizar toda-args constructor:

new Foo(true, false, true)

Debido a la forma, las manijas Groovy lo que parece argumentos con nombre (Groovy no admite argumentos con nombre - que pasa un mapa), esto también fallar con código Groovy similar. La forma maravillosa maneja el mapa que pasa aquí, es desenrollando el mapa en las llamadas setter (y no hay ninguno porque los atributos son finales).

@groovy.transform.TupleConstructor
class Foo {
    final boolean bar
    final boolean baz
    final boolean boo
}

new Foo(bar: true, baz: false, boo: true)

falla con

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)

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=187120&siteId=1
Recomendado
Clasificación