2015-12-18 60 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

相關問題