2010-01-08 3 views
4

Мне нужно более чистое решение для использования ImmutableSet. У меня есть код, который выглядит какGuava: ImmutableSet либо значений, либо пустого набора

Set foo = ImmutableSet.copyOf(aGeoR.getFailed()); 

он прекрасно работает, когда aGeoR.getFailed() возвращает одну или несколько записей.

он терпит неудачу, когда возвращаемый набор равен NULL.

Когда его нуль, мне нужно

Set foo = ImmutableSet.of(); 

Что такое чистый способ сделать это?

ответ

2
Set foo = aGeoR.getFailed(); 
foo = foo == null ? new HashSet() : ImmutableSet.copyOf(foo); 
+2

Лучше, чем ваше предложение было бы: Foo = Foo == NULL? ImmutableSet.of(): ImmutableSet.copyOf (foo); , но это действительно не намного чище, IMHO – fishtoprecords

+3

Чистый способ исправить это - изменить getFailed(), чтобы возвращать ненулевое значение всегда или получить Guava, чтобы принять нулевое значение в его параметре. Если вы имеете дело с двумя разными библиотеками, то лучше всего использовать шаблон адаптера, чтобы сгладить несогласованности или справиться с сдвигом – Jherico

+2

Guava, а материал коллекции позади него действительно не нравится нулевым значениям. Его дизайн для них. И мне это нравится. Большую часть времени. – fishtoprecords

17

Это сформулирован как вопрос о гуавах и ImmutableSet, но реальная проблема здесь с aGeoR.getFailed(). По сути, никогда не подходит для метода возврата коллекции для возврата null. Он должен возвращать пустой набор для начала (см. Эффективная Java); и да, тот факт, что это не будет причинять боль пользователям.

Когда мне приходится иметь дело с подобным API, и я не могу его исправить или исправить, я точно понимаю, что вы указали в своей ревизии ответа @ Jherico.

Set<FailedGeoR> failedOrNull = aGeoR.getFailed(); 
Set<FailedGeoR> failed = (failedOrNull == null) 
    ? ImmutableSet.<FailedGeoR>of() 
    : ImmutableSet.copyOf(failedOrNull); 
+0

Я думаю, что это должно быть 'ImmutableSet. of() 'вместо' ImmutableSet.of() ' – Liang

+0

@Liang Достаточно. К сожалению. –