Effective java Item 43 states return empty arrays or collections, not nulls. In practice you should return the same immutable empty collection every time you return a collection. There are a few ways to handle the exception to the rule when you encounter methods that should return a collection but instead return null. Check out return empty list , return empty map , return empty enumeration , return empty list iterator , return empty sorted set , return empty sorted map and return empty iterator when having to deal with other collection types.
Straight up Java @Test
public void return_empty_set_java () {
Set < String > emptySet = Collections . emptySet ();
assertTrue ( emptySet . isEmpty ());
}
Google Guava @Test
public void return_empty_set_guava () {
ImmutableSet < Object > emptySet = ImmutableSet . of ();
assertTrue ( emptySet . isEmpty ());
}
Apache Commons @Test
public void return_empty_set_apache_commons () {
@SuppressWarnings ( "unchecked" )
Set < String > emptySet = SetUtils . EMPTY_SET ;
assertTrue ( emptySet . isEmpty ());
}
Exception to the rule The goal is to handle the null to empty collection early in the chain. If you are coding the method that returns a set, there is no reason it should return null. When dealing with legacy code you have to deal with a null so here are a few options when that occurs:
Just make the null and empty check private void return_empty_set_java_exception () {
DomainObject domain = null ; // dao populate domain
Set < String > strings ;
if ( domain != null
&& domain . getStrings () != null
&& domain . getStrings (). size () > 0 ) {
strings = domain . getStrings ();
} else {
strings = Collections . emptySet ();
}
}
Use Guava Objects.firstNonNull private void return_empty_set_guava_exception () {
DomainObject domain = null ; // dao populate domain
Set < String > strings = Objects . firstNonNull (
domain != null ? domain . getStrings () : null ,
ImmutableSet .< String > of ());
//...
}
Apache commons SetUtils private void return_empty_set_apache_commons_exception () {
DomainObject domain = null ; // dao populate domain
Set < String > strings ;
if ( domain != null && ! CollectionUtils . isEmpty ( domain . getStrings ())) {
strings = domain . getStrings ();
} else {
strings = SetUtils . EMPTY_SET ;
}
//...
}
Return empty set posted by Justin Musgrove on 10 January 2014
Tagged: java and java-collections
Share on: Facebook Google+
All the code on this page is available on github:
ReturnEmptySet.java