2015-12-18 30 views
5

在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) 
} 

,这将抛出一个NullPointerException如果我叫items(null)但正常工作,如果我只是说items()。为了使这个工作正确,我必须将行改为new HashSet<>(items ?: []),这又似乎违背了具有默认方法参数值的整个目的。

我在这里错过了什么?

回答

6

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

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

会产生这两种方法(我用javap得到这些值):当你调用items(null)你,其实

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

所以,经过一定的价值,并items(Set)方法将被使用。

您也可以参考this question关于默认参数。

+0

这使得总体感觉。感谢并感谢链接到其他帖子。那么使用Elvis算子的正确答案是什么? – icfantv

+0

是的。我认为elvis是很好的解决方案。 – Will

+1

@icfantv,如果你不喜欢这种重复,那么使用null作为默认参数,elvis +你想要的值。 – cfrick

相关问题