2013-07-03 12 views
5

Mam metodę, która przyjmuje argument Collection<Foo> foos, który może mieć wartość NULL. Chcę skończyć z lokalną kopią danych wejściowych jako ImmutableSet. Teraz mój kod wygląda następująco:Czystość metody Guava do obsługi kolekcji o możliwej wartości zerowej

if (foos == null) 
{ 
    this.foos = ImmutableSet.of(); 
} 
else 
{ 
    this.foos = ImmutableSet.copyOf(foos); 
} 

Czy istnieje lepszy sposób na zrobienie tego? Jeśli foos byłby prostym parametrem, mogłem zrobić coś takiego, jak Objects.firstNonNull(foos, Optional.of()), ale nie jestem pewien, czy istnieje coś podobnego do obsługi kolekcji.

Odpowiedz

13

ja nie rozumiem, dlaczego nie można używać Objects.firstNonNull:

this.foos = ImmutableSet.copyOf(Objects.firstNonNull(foos, ImmutableSet.of())); 

Można zaoszczędzić trochę pisanie z importu statycznych, jeśli to twoja sprawa:

import static com.google.common.collect.ImmutableSet.copyOf; 
import static com.google.common.collect.ImmutableSet.of; 
// snip... 
this.foos = copyOf(Objects.firstNonNull(foos, of())); 
+5

+1 I warto zauważyć, że 'copyOf' jest wystarczająco inteligentny, aby po prostu zwrócić dane wejściowe, jeśli jest to' ImmutableSet'. –

+1

@ PaulBellora Wierzę, że właśnie zrobiłeś. ':)' –

+3

Również 'ImmutableSet. () może być niestety konieczne. –

7

Collection jest odniesienie jak każdy inny, więc można zrobić:

ImmutableSet.copyOf(Optional.fromNullable(foos).or(ImmutableSet.of())); 

Ale to staje się dość garstka pisać. Bardziej prosty:

foos == null ? ImmutableSet.of() : ImmutableSet.copyOf(foos); 
+0

Drugi przykład ma tę zaletę, że nie tworzy pustej kolekcji, gdy nie jest potrzebna. Odpowiedź MattBall zawsze tworzy puste 'Set', nawet jeśli przekazana kolekcja nie ma wartości NULL. –

+5

@JohnB 'ImmutableSet.of()' [zwraca jeden singleton] (http://docs.guava-libraries.googlecode.com/git/javadoc/src-html/com/google/common/collect/ImmutableSet.html# wiersz.83). –

+0

ah, oczywiście, że tak! Twoje zdrowie. –

Powiązane problemy