Java 番石榴:值或空集的不可变表集

Java 番石榴:值或空集的不可变表集,java,guava,Java,Guava,我需要一个更干净的解决方案来使用ImmutableSet。我有这样的代码 Set foo = ImmutableSet.copyOf(aGeoR.getFailed()); 当aGeoR.getFailed()返回一个或多个条目时,它非常有效 当返回的集合为空时,它将失败 当它为空时,我需要一个 Set foo = ImmutableSet.of(); 什么是干净的方法呢?这是一个关于番石榴和ImmutableSet的问题,但真正的问题是aGeoR.getFailed()。集合返回方法返回n

我需要一个更干净的解决方案来使用ImmutableSet。我有这样的代码

Set foo = ImmutableSet.copyOf(aGeoR.getFailed());
当aGeoR.getFailed()返回一个或多个条目时,它非常有效

当返回的集合为空时,它将失败

当它为空时,我需要一个

Set foo = ImmutableSet.of();

什么是干净的方法呢?

这是一个关于番石榴和
ImmutableSet
的问题,但真正的问题是
aGeoR.getFailed()
。集合返回方法返回null在本质上是不合适的。它应该首先返回一个空集(请参见有效Java);是的,事实并非如此,这将给用户带来一些痛苦

Set foo = aGeoR.getFailed();
foo = foo == null ? new HashSet() : ImmutableSet.copyOf(foo);
当我不得不处理这样一个API时,我无法修复它,也无法让它得到修复,我完全按照您在@Jherico答案的修订版中所展示的那样做

Set<FailedGeoR> failedOrNull = aGeoR.getFailed();
Set<FailedGeoR> failed = (failedOrNull == null)
    ? ImmutableSet.<FailedGeoR>of()
    : ImmutableSet.copyOf(failedOrNull);
Set failedOrNull=aGeoR.getFailed();
设置失败=(failedOrNull==null)
? ImmutableSet.of()
:ImmutableSet.copyOf(失败或全部);

比您的建议更好的是:foo=foo==null?ImmutableSet.of():ImmutableSet.copyOf(foo);但这并不是很干净,修复它的干净方法是更改getFailed()以始终返回非null值,或者让Guava在其参数中接受null值。如果您处理的是两个不同的库,那么最好的选择是使用适配器模式来消除不一致或处理shearGuava,它背后的集合内容确实不喜欢空值。这是为他们设计的。我倾向于喜欢它。大多数时候。你为什么喜欢空的?对我来说,当库倾向于返回null而不是空集合时,这会带来很多麻烦。我想那些不了解集合的人。emptySet()害怕创建大量琐碎的集合,只返回null。当然不是个好主意。我认为应该是
ImmutableSet.of()
而不是
ImmutableSet.of()
@。悲哀地