Возможно ли иметь именованные параметры со значениями по умолчанию в groovy? Мой план состоит в создании своего рода объекта factory, который можно вызвать без каких-либо аргументов, чтобы получить объект со значениями по умолчанию. Кроме того, мне понадобится функция для явного задания любого из параметров для объекта. Я считаю, что это возможно с помощью аргументов ключевого слова Python, например.
Код, который я пытаюсь сделать прямо сейчас, находится ниже
// Factory method
def createFoo( name='John Doe', age=51, address='High Street 11') {
return new Foo( name, age, address )
}
// Calls
Foo foo1 = createFoo() // Create Foo with default values
Foo foo2 = createFoo( age:21 ) // Create Foo where age param differs from defaut
Foo foo3 = createFoo( name:'Jane', address:'Low Street 11' ) // You get the picture
// + any other combination available
Реальное приложение, над которым я работаю, будет иметь гораздо больше параметров и, следовательно, потребуется больше комбинаций.
Спасибо
UPDATE:
Метод factory, который я планирую, предназначен для тестирования. Невозможно по-настоящему коснуться фактического класса Foo и, особенно, не его значений по умолчанию.
@dmahapatro и @codelarks answere ниже имели хорошую возможность использовать карту в качестве параметра, который дал мне представление о возможном решении. Я мог бы создать карту с желаемыми значениями по умолчанию и переопределить необходимые значения и передать это методу factory. Это, вероятно, сделает эту работу, и я пойду с этим, если не получу намека на лучший подход.
Мой текущий подход ниже
defaults = [ name:'john', age:61, address:'High Street']
@ToString(includeFields = true, includeNames = true)
class Foo {
// Can't touch this :)
def name = ''
def age = 0
def address = ''
}
def createFoo( Map params ) {
return new Foo( params )
}
println createFoo( defaults )
println createFoo( defaults << [age:21] )
println createFoo( defaults << [ name:'Jane', address:'Low Street'] )
ПРИМЕЧАНИЕ: операция leftShift (< <) изменяет исходную карту, поэтому в приведенном выше примере возраст будет равен 21 в последнем вызове метода. В моем случае это не проблема, так как карта по умолчанию может быть создана свежестью каждый раз в методе настройки.