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.

  • java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: no se puede fusionar dex
  • Usando AnkoLogger con niveles que no sean "información"
  • Cómo agregar varias instrucciones dentro de una instrucción when en kotlin
  • Declarar Literales de Función con parameters de input generics en Kotlin
  • Timeline Mission no ejecuta misiones
  • Referencia al setter de properties de la class Kotlin como function
  • Kotlin lambda con varios parameters
  • Uso de Kotlin Coroutines
  • Sala: error al utilizar @Transaction
  • FireStore Transactions incrementa y disminuye el contador obteniendo resultados inconsistentes
  • Sitio de Android, agregando classs de datos de la biblioteca a la database