Вы можете использовать InvokeHelper категории и setProperties метод, вот короткий пример:
import groovy.transform.EqualsAndHashCode
import groovy.transform.ToString
import org.codehaus.groovy.runtime.InvokerHelper
@EqualsAndHashCode
@ToString
class Address {
String street
String number
String city
}
Address mainAddress = new Address(street: 'Test', number: '2B', city: 'London')
use InvokerHelper, {
mainAddress.setProperties([street: 'Lorem', number: 'Ipsum'])
}
assert mainAddress.street == 'Lorem'
assert mainAddress.number == 'Ipsum'
assert mainAddress.city == 'London'
Хотя, если вы можете избежать изменяемые объекты, это лучше для вас , В противном случае вам нужно подумать о безопасности потоков, чтобы не столкнуться с проблемами параллелизма. Вы можете использовать предыдущий пример для создания статического метода, который ожидает 2 аргумента: существующий объект и карту свойств для обновления. В результате вы получаете новый экземпляр, содержащий обновленные поля. Также вы можете сделать свой класс неизменным.
в bad 'myAddress.properties.putAll' не работает – cfrick