Данный код вызовет некоторые проблемы.В частности, он сгенерирует два конструктора с одним параметром Object.Первый конструктор генерирует байт-код, эквивалентный:
A() // a,b both default
A(Object) // a set, b default
A(Object, Object) // pass in both
Второй генерирует это:
A(Object) // accepts any object
Вы можете обойти эту проблему, добавив некоторые типы.Несмотря на то, что groovy имеет динамическую типизацию, объявления типов в методах и конструкторах по-прежнему имеют значение.Например:
A(int a = 1, String b = "str") { ... }
A(Map args) { ... }
Что касается хороших практик, я бы просто использовал одну из аннотаций groovy.transform.Canonical
или groovy.transform.TupleConstructor
.Они автоматически предоставят правильную карту свойств и конструкторы позиционных параметров.TupleConstructor предоставляет только конструкторы, Canonical применяет некоторые другие рекомендации в отношении equals
, hashCode
и toString
.