传递null时应用默认的groovy方法参数值

时间:2015-12-18 16:31:21

标签: groovy default-value

在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 ?: []),这似乎也破坏了使用默认方法参数值的全部目的。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:8)

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

public String[] splitString(String s) {
    List<String> results = new ArrayList<>();
    int start = 0;

    while (true) {
        int next = s.indexOf('-', start);

        if (next < 0) {
            break;
        }
        results.add(s.subString(0, next));
        results.add(s.subString(next + 1));
        start = next + 1;
    }

    return results.toArray(new String[results.size()]);
}

将生成这两种方法(我使用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)方法。

您还可以参考有关默认参数的this question