He anotado con objeto siguiente @Value
de Lombok:
@Value
public class Foo {
private final boolean bar;
private final boolean baz;
private final boolean boo;
}
Trato de crear una instancia Foo
de 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?
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)