2015-12-18 8 views
5

W Groovy, jeśli mam:Stosowanie domyślnej metody Groovy wartość parametru podczas przechodzenia zerowy

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

a następnie zadzwonić:

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

Dlaczego ostatni zaczyna interpretować dosłownie jako null i niestosowania wartość domyślna? Czy nie jest to sprzeczne z celem domyślnych wartości argumentów metody? Dostaję, że przechodzenie od null różni się od nieprzesyłania niczego z/r/t długości argumentu.

Moim problemem jest to, że jeśli teraz mam metodę, która pobiera kolekcję jako argument:

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

Ten rzuci NullPointerException jeśli zadzwonię items(null) ale działa dobrze, jeśli po prostu powiedzieć items(). Aby to zadziałało poprawnie, muszę zmienić linię na new HashSet<>(items ?: []), która, jak się wydaje, pokonuje cały cel posiadania domyślnych wartości argumentów metod.

Czego mi tu brakuje?

Odpowiedz

6

W Groovy, parametry domyślne generują przeciążone metody. Tak więc, to:

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

będzie generować te dwie metody (użyłem javap dostać te wartości):

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

Więc kiedy zadzwonisz items(null) jesteś w rzeczywistości, przechodząc jakąś wartość, a items(Set) zostanie zastosowana metoda.

Możesz również zapoznać się z this question o domyślnych parametrach.

+0

To ma sens. Dziękuję i dziękuję za link do drugiego postu. Czy więc prawidłową odpowiedzią jest użycie operatora Elvisa? – icfantv

+0

Tak. Myślę, że elvis to dobre rozwiązanie. – Will

+1

@icfantv i jeśli nie podoba ci się duplikowanie, użyj null jako domyślnego parametru i elvis + wartość, którą chcesz hav.e – cfrick

Powiązane problemy