que comentarios groovy named-parameters keyword-argument

comentarios - parámetros nombrados con valores por defecto en groovy



groovy vs java (1)

Groovy lo hace por usted por defecto (constructor de mapa). No necesitarías un método de fábrica. Aquí hay un ejemplo

import groovy.transform.ToString @ToString(includeFields = true, includeNames = true) class Foo{ String name = "Default Name" int age = 25 String address = "Default Address" } println new Foo() println new Foo(name: "John Doe") println new Foo(name: "Max Payne", age: 30) println new Foo(name: "John Miller", age: 40, address: "Omaha Beach") //Prints Foo(name:Default Name, age:25, address:Default Address) Foo(name:John Doe, age:25, address:Default Address) Foo(name:Max Payne, age:30, address:Default Address) Foo(name:John Miller, age:40, address:Omaha Beach)

ACTUALIZAR
La astrología de @ codelark :). En caso de que no se pueda acceder a la clase para establecer valores predeterminados, puede hacer lo siguiente:

@ToString(includeFields = true, includeNames = true) class Bar{ String name int age String address } def createBar(Map map = [:]){ def defaultMap = [name:''John Doe'',age:51,address:''High Street 11''] new Bar(defaultMap << map) } println createBar() println createBar(name: "Ethan Hunt") println createBar(name: "Max Payne", age: 30) println createBar(name: "John Miller", age: 40, address: "Omaha Beach") //Prints Bar(name:John Doe, age:51, address:High Street 11) Bar(name:Ethan Hunt, age:51, address:High Street 11) Bar(name:Max Payne, age:30, address:High Street 11) Bar(name:John Miller, age:40, address:Omaha Beach)

¿Es posible tener parámetros nombrados con valores predeterminados en groovy? Mi plan es hacer una especie de fábrica de objetos, que se pueda llamar sin argumentos para obtener un objeto con valores predeterminados. Además, necesitaría la funcionalidad para establecer explícitamente cualquiera de los parámetros para el objeto. Creo que esto es posible con los argumentos de palabras clave de Python, por ejemplo.

El código con el que estoy intentando ahora es algo como abajo

// 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

La aplicación real en la que estoy trabajando tendrá muchos más parámetros y, por lo tanto, se necesitarán muchas más combinaciones.

Gracias

ACTUALIZAR:

El método de fábrica que estoy planeando es para propósitos de prueba. Realmente no se puede tocar la clase real de Foo y, especialmente, no son sus valores predeterminados.

La respuesta de @dmahapatro y @codelarks tuvo un buen punto al usar un Mapa como parámetro que me dio una idea de una posible solución. Podría crear un mapa con los valores predeterminados deseados, anular los valores necesarios y pasarlo al método de fábrica. Esto probablemente hará el trabajo y continuaré con eso, a menos que obtenga un indicio de un mejor enfoque.

Mi enfoque actual a continuación

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''] )

NOTA: la operación leftShift (<<) modifica el mapa original, por lo que en el ejemplo anterior la edad también será 21 en la última llamada de método. En mi caso, esto no es un problema ya que el mapa de valores predeterminados se puede crear recientemente cada vez que se usa el método de configuración.