【问题标题】:Applying default groovy method parameter value when passing null传递 null 时应用默认的 groovy 方法参数值
【发布时间】:2016-03-25 10:06:07
【问题描述】:

在 Groovy 中,如果我有:

def say(msg = 'Hello', name = 'world') {
  "$msg $name!"
}

然后调用:

say() // Hello world!
say("hi") // Hi world!
say(null) // null world!

为什么最后一个被逐字解释为null 而没有应用默认值?这不会破坏默认方法参数值的目的吗?我确实知道传递 null 与不传递任何 w/r/t 参数长度不同。

我的问题是,如果我现在有一个将集合作为参数的方法:

def items(Set<String> items = []) {
  new HashSet<>(items)
}

如果我打电话给items(null),这将抛出一个NullPointerException,但如果我只说items(),它就可以正常工作。为了使其正常工作,我必须将行更改为 new HashSet&lt;&gt;(items ?: []),这似乎再次违背了使用默认方法参数值的全部目的。

我在这里错过了什么?

【问题讨论】:

    标签: groovy default-value


    【解决方案1】:

    在 Groovy 中,默认参数会生成重载方法。因此,这是:

    def items(Set<String> items = []) {
      new HashSet<>(items)
    }
    

    会生成这两个方法(我用javap来获取这些值):

    public java.lang.Object items(java.util.Set<java.lang.String>);
    public java.lang.Object items();
    

    所以当你调用items(null)时,你实际上是在传递一些值,并且items(Set)方法会被使用。

    默认参数也可以参考this question

    【讨论】:

    • 这完全有道理。感谢并感谢您提供指向其他帖子的链接。那么使用猫王算子是正确的答案吗?
    • @icfantv,如果你不喜欢重复,那么使用 null 作为默认参数和 elvis + 你想要的值。e
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2011-04-15
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    相关资源
    最近更新 更多