Объединение обязательных и произвольных необязательных аргументов конструктора с Groovy

Я пытаюсь определить, исключительно из интереса, можно ли полностью удалить необходимость использования шаблона Builder в Groovy с использованием аргументов конструктора named и default; то есть решить проблему конструктора телескопа, используя только встроенные функции языка.

Например, в Котлине можно сделать следующее:

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) } } 

Это дает следующий результат:

 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) 

Линия, представляющая особый интерес, представляет собой:

 Thing(1, 2, optional2 = 4), 

доходность

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

Обратите внимание, что мне удалось установить опцию2 без необходимости установки опции1 . Я не уверен, что это возможно в Groovy, но, опять же, я далек от экспертов.

Как интересно, глядя на сгенерированный байт-код, компилятор Kotlin, похоже, генерирует один конструктор, а затем перезаписывает операторы создания экземпляра, чтобы передать необязательные аргументы в правильной точке списка аргументов.

Итак, экспертам Groovy, это просто невозможно в Groovy, или я еще не нашел правильный синтаксис?

Заранее спасибо,

Саймон

Это возможно в groovy. Например:

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

На этом этапе вам даже не нужен конструктор, если все, что вы планируете делать, это присвоить значения. вы можете просто сказать:

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

Если вы прочитаете раздел 1.4 этого документа: http://groovy-lang.org/objectorientation.html , в нем указано, что вы можете выбирать между конструкторами позиций или именованными конструкторами.

В моем примере используется именованный конструктор аргументов, который дает больше полномочий тому, кто вызывает конструктор.

Если вы хотите, чтобы любые переменные были обязательными, вам нужно будет использовать конструктор позиционеров, который сродни тому, как это делается в прямом java.

если вы определяете конструктор для своего класса, то вы используете конструкторы positional и больше не можете использовать конструкторы названных аргументов для этого класса.