加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在groovy中使用默认值命名参数

发布时间:2020-12-14 16:34:38 所属栏目:大数据 来源:网络整理
导读:在groovy中是否可以使用默认值命名参数?我的计划是制作一个对象工厂,它可以被调用,没有任何参数,以获得一个默认值的对象.此外,我需要功能来显式设置对象的任何参数.例如,我相信这是可能的 Python关键字参数. 我正在尝试的代码现在就是如下所示 // Factory m
在groovy中是否可以使用默认值命名参数?我的计划是制作一个对象工厂,它可以被调用,没有任何参数,以获得一个默认值的对象.此外,我需要功能来显式设置对象的任何参数.例如,我相信这是可能的 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

我正在开发的真正的应用程序将有更多的参数,因此需要更多的组合.

谢谢

更新:

我计划的工厂方法是用于测试目的.不能真正触及实际的Foo类,特别是不是默认值.

@dmahapatro和@codelarks answerere在使用地图作为参数有一个好点,让我想起了一个可能的解决方案.我可以使用想要的默认值创建一个地图,并覆盖所需的值,并将其传递给工厂方法.这可能会做这个工作,我会一起去,除非我得到一个更好的方法.

我目前的做法如下

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操作(<)修改原始映射,所以在上面的例子中,上一个方法调用中的age将是21.在我的情况下,这不是一个问题,因为默认映射可以每次在安装方法中创建.

解决方法

Groovy默认为你做(map构造函数).您不需要工厂方法.这是一个例子

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,address:Default Address)
Foo(name:Max Payne,age:30,address:Default Address)
Foo(name:John Miller,age:40,address:Omaha Beach)

UPDATE
@ codelark的占星术:)如果类不能设置默认值,您可以这样做

@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",address: "Omaha Beach")


//Prints
Bar(name:John Doe,address:High Street 11)
Bar(name:Ethan Hunt,address:High Street 11)
Bar(name:Max Payne,address:High Street 11)
Bar(name:John Miller,address:Omaha Beach)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读