2015-12-18 6 views
5

In Groovy vorbei, wenn ich:Standard groovy Methode Parameterwert anwenden, wenn null

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

Und dann rufen:

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

Warum ist das letzte wahrsten Sinne des Wortes als null und nicht die Anwendung interpretiert zu werden der Standardwert? Schadet das nicht dem Zweck der Standardmethodenargumentwerte? Ich bekomme, dass die Weitergabe null ist anders als keine Übergabe w/r/t Argument Länge.

Mein Problem hier ist, dass wenn ich jetzt eine Methode, die eine Sammlung als Argument:

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

Diese ein NullPointerException werfen, wenn ich items(null) nennen, aber gut funktionieren, wenn ich items() nur sagen. Damit dies richtig funktioniert, muss ich die Zeile ändern, um zu sein, was wiederum den gesamten Zweck der Standardmethodenargumentwerte zu besiegen scheint.

Was fehlt mir hier?

Antwort

6

In Groovy generiert Standardparameter überladene Methoden. Somit folgt aus:

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

Werden diese beiden Methoden erzeugen (I verwendet javap diese Werte zu erhalten):

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

Also, wenn Sie anrufen items(null) Sie sind in der Tat einen gewissen Wert vorbei, und items(Set) Methode wird verwendet.

Sie können auch auf this question über Standardparameter beziehen.

+0

Das macht absolut Sinn. Danke und Danke für den Link zum anderen Beitrag. Also ist die richtige Antwort, dann den Elvis-Operator zu benutzen? – icfantv

+0

Ja. Ich denke elvis ist eine gute Lösung. – Will

+1

@icfantv und wenn Sie die Duplizierung nicht mögen, dann verwenden Sie null als Standardparameter und elvis + den Wert, den Sie haben möchten – cfrick

Verwandte Themen