开发者

Guava: ImmutableSet of either values or an empty set

I need a cleaner solution to using an ImmutableSet. I have code t开发者_如何学Pythonhat looks like

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

it works great when aGeoR.getFailed() returns one or more entries.

it fails when the returned set is null.

When its null, I need a

Set foo = ImmutableSet.of();

What is the clean way to do this?


This is phrased as a question about Guava and ImmutableSet, but the real issue here is with aGeoR.getFailed(). It is essentially never appropriate for a collection-returning method to return null. It should be returning an empty set to begin with (see Effective Java); and yeah, the fact that it isn't is going to cause some pain to users.

When I have to deal with an API like that, and I can't fix it or get it fixed, I do exactly what you showed in your revision of @Jherico's answer.

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


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


I would use an Optional:

Set<FailedGeoR> foo = Optional.ofNullable(aGeoR.getFailed())
        .map(ImmutableSet::copyOf)
        .orElse(ImmutableSet.of())


I agree @Agustín Ranieri, but if possible, I hope Guava add ofNull and copyOfNull methods, like Optional, and it's just do one more thing, when element is null or empty, always return ImmutableSet.of(), it's let me write less duplicates code.

// the foo always not be null
ImmutableSet<?> foo = ImmutableSet.copyOfNull(aGeoR.getFailed());
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜