Возможно ли иметь именованные параметры со значениями по умолчанию в groovy? Мой план состоит в том, чтобы создать своего рода объектную фабрику, которую можно вызвать без каких-либо аргументов, чтобы получить объект со значениями по умолчанию. Кроме того, мне понадобится функциональность, чтобы явно установить любой из параметров для объекта. Я считаю, что это возможно с помощью аргументов ключевого слова Python, например.именованные параметры со значениями по умолчанию в groovy
Код я пытаюсь с прямо сейчас что-то вроде ниже
// 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:
Фабричный метод я планирую для целей тестирования. Невозможно по-настоящему коснуться фактического класса Foo и, особенно, его значения по умолчанию.
@dmahapatro и @codelarks answere ниже имели хорошую возможность использовать карту как параметр, который дал мне представление о возможном решении. Я мог бы создать карту с желаемыми значениями по умолчанию и переопределить необходимые значения и передать это фабричному методу. Это, вероятно, сделает эту работу, и я пойду с этим, если не получу намек на лучший подход.
Мой текущий подход ниже
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 а. В моем случае это не проблема, так как карта по умолчанию может быть создана свежестью каждый раз в методе настройки.
Не делайте этого. 'defaults' поддерживает состояние в этом случае. Сделайте его локальным. См. Мое обновление. – dmahapatro
Я понял, что, следовательно, заметка в моем обновлении. Во всяком случае, использование локальной локальной карты функций по умолчанию является гораздо лучшим подходом. Спасибо за совет. – kaskelotti