Best practices relating to Java Collection framework are as follow:
- Choose the right type of data structure based on usage patterns like fixed size or required to grow, duplicates allowed or not, ordering is required to be maintained or not, traversal is forward only or bi-directional, inserts at the end only or any arbitrary position, more inserts or more reads, concurrently accessed or not, modification is allowed or not, homogeneous or heterogeneous collection, etc. Also, keep multi-threading, atomicity, memory usage and performance considerations discussed earlier in mind.
- Don’t assume that your collection is always going to be small as it can potentially grow bigger with time. So your collection should scale well.
- Program in terms of interface not implementation: For example, you might decide a LinkedList is the best choice for some application, but then later decide ArrayList might be a better choice for performance reason.
- Bad:
- ArrayList list = new ArrayList(100);
- Good:
- Bad:
// program to interface so that the implementation can change
- List list = new ArrayList(100);
- List list2 = new LinkedList(100);
- Return zero length collections or arrays as opposed to returning a null in the context of the fetched list is actually empty. Returning a null instead of a zero length collection is more error prone, since the programmer writing the calling method might forget to handle a return value of null.
- List emptyList = Collections.emptyList( );
- Set emptySet = Collections.emptySet( );
- Use generics for type safety, readability, and robustness.
- Encapsulate collections: In general, collections are not immutable objects. So care should be taken not to unintentionally expose the collection fields to the caller. The caller may not perform any necessary validation.