English 中文(简体)
Guava: ImmutableSet of either values or an empty set
原标题:
  • 时间:2010-01-08 01:51:05
  •  标签:
  • java
  • guava

I need a cleaner solution to using an ImmutableSet. I have code that 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());




相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签