Combinar arguments de constructor opcionales obligatorios y arbitrarios con Groovy

Estoy tratando de determinar, por puro interés, si es posible eliminar por completo la necesidad de usar el patrón de generador en Groovy usando arguments de constructor con nombre y por defecto; es decir, para resolver el problema del constructor telescópico usando solo las características del lenguaje incorporado.

Por ejemplo, en Kotlin, es posible hacer lo siguiente:

data class Thing(val mandatory1: Int, val mandatory2: Int, val optional1: Int = 100, val optional2: Int = 200, val nullable: Int? = null) fun main(args: Array<String>) { val things = listOf( Thing(1, 2), Thing(1, 2, 3), Thing(1, 2, 3, 4), Thing(1, 2, 3, 4, 5), Thing(1, 2, optional2 = 4), Thing(1, 2, optional1 = 4), Thing(1, 2, nullable = 4), Thing( nullable=400, mandatory1 = 800, optional1 = 300, optional2 = 700, mandatory2 = 600)) things.forEach { t -> println(t) } } 

Esto produce el siguiente resultado:

 Thing(mandatory1=1, mandatory2=2, optional1=100, optional2=200, nullable=null) Thing(mandatory1=1, mandatory2=2, optional1=3, optional2=200, nullable=null) Thing(mandatory1=1, mandatory2=2, optional1=3, optional2=4, nullable=null) Thing(mandatory1=1, mandatory2=2, optional1=3, optional2=4, nullable=5) Thing(mandatory1=1, mandatory2=2, optional1=100, optional2=4, nullable=null) Thing(mandatory1=1, mandatory2=2, optional1=4, optional2=200, nullable=null) Thing(mandatory1=1, mandatory2=2, optional1=100, optional2=200, nullable=4) Thing(mandatory1=800, mandatory2=600, optional1=300, optional2=700, nullable=400) 

La línea de interés particular es donde:

 Thing(1, 2, optional2 = 4), 

performances

 Thing(mandatory1=1, mandatory2=2, optional1=100, optional2=4, nullable=null) 

Tenga en count que pude establecer optional2 sin tener que configurar optional1 . No estoy seguro de que esto sea posible en Groovy, pero una vez más, estoy lejos de ser un experto.

Como punto de interés, al observar el código de bytes generado, el comstackdor de Kotlin parece generar un solo constructor y luego reescribe las sentencias de instanciación para pasar los arguments opcionales en el punto correcto de la list de arguments.

Entonces, para los expertos de Groovy, ¿esto simplemente no es posible en Groovy o aún no he encontrado la syntax correcta?

Gracias por adelantado,

Simon

Esto es posible en Groovy. Por ejemplo:

 Class Thing{ def x def y def z = 5 } 

En este punto, ni siquiera necesita un constructor si todo lo que planea hacer es asignar valores. solo puedes decir:

 new Thing(x: "Hello", y:"World", z:6) //if you want to overwrite the defualt value of z. 

Si lee la sección 1.4 de este documento: http://groovy-lang.org/objectorientation.html , indica que puede elegir entre tener constructores posicionales o constructores nombrados.

Mi ejemplo es usar un constructor de argumento nombrado que da más poder al que llama al constructor.

Si quieres que cualquier variable sea obligatoria, necesitarás usar un constructor de position, que es similar a cómo se hace en Java directa.

si defines un constructor para tu class, entonces estás usando constructores posicionales y ya no puedes usar constructores de arguments nombrados para esa class.

  • Extraña java.lang.ClassCastException al usar la llamada
  • RxJava2 switchIfEmpty y verificando una ejecución
  • No se puede ejecutar la aplicación JavaFX - Kotlin
  • Agregar / Consultar / Analizar SQLite usando Anko
  • Pase listOf (mapOf (x, y, z)) como parámetro en Kotlin
  • Runnable no se ejecuta en la barra de acción flotante en Android
  • Cómo escribir un método de extensión genérico en Kotlin?
  • Enlace de datos de Android con Kotlin, BaseObservable y un delegado personalizado
  • Una list de files descargados es nula
  • Orden de datos de spring por function de Java
  • Funciona butterknife 7.x con Kotlin M14?