Use interface references to Collections

In general, references to objects should be as generic as possible. The user of such a reference will be protected from possible changes to the underlying implementation class. The ripple effects of such a change are limited to the single line of code which creates the object, and will not propagate any further.

In the case of collections, this means habitually referring to collection objects using List, Map, Set, Queue, and Deque interface references.

Note as well that all of these except Map can be referred to using the even more generic Collection.


import java.util.*;

public class Nucleus {

  public static void main (String... args) {
    Nucleus lithium = new Nucleus (3,4);
    //note the generic Map reference is used here, not LinkedHashMap
    Map<String, Integer> quarks = lithium.getQuarkSummary();
    log("Number of up quarks in lithium nucleus: " + quarks.get("Up"));
    log("Number of down quarks in lithium nucleus: " + quarks.get("Down"));

  public Nucleus(int numProtons, int numNeutrons) {
    this.numProtons = numProtons;
    this.numNeutrons = numNeutrons;

  /** Note this get method is final. */
  public final int getNumProtons() {
     return numProtons;

  /** Note this get method is final. */
  public final int getNumNeutrons() {
     return numNeutrons;

  * This method returns a Map which summarizes how many quarks of each
  * flavour are in the nucleus.
  * @return a generic Map reference, instead of a LinkedHashMap; the
  * user will be protected from the detail of what implementation of Map
  * has been selected here.
  public final Map<String, Integer> getQuarkSummary() {
    LinkedHashMap<String, Integer> result = new LinkedHashMap<>();
    int numUp =
      numProtons * UP_QUARKS_PER_PROTON +
      numNeutrons * UP_QUARKS_PER_NEUTRON
    int numDown =
      numProtons * DOWN_QUARKS_PER_PROTON +
      numNeutrons * DOWN_QUARKS_PER_NEUTRON
    //this makes use of auto-boxing of ints into Integers:
    result.put("Up", numUp);
    result.put("Down", numDown);
    return result;

  private final int numProtons;
  private final int numNeutrons;

  private static final int UP_QUARKS_PER_PROTON = 2;
  private static final int DOWN_QUARKS_PER_PROTON = 1;

  private static final int UP_QUARKS_PER_NEUTRON = 1;
  private static final int DOWN_QUARKS_PER_NEUTRON = 2;

  private static void log(String aMessage){

See Also :
Minimize ripple effects