Re: List Interfaces
Where the principle of, "Program to an interface, not an
implementation," carries more weight in Java is in method declarations.
For example, if the sendLetterTo() method above should be declared as,
public void sendLetterTo(Collection collection);
So that the implementation of the collection can change without
affecting code. But it doesn't matter if, in the method body shown
above - and for this example - "customers" was declared as ArrayList or
If I may add something without belaboring the point:
Choose the highest level class or interface that does want you want, but no
For example, if you need iteration in a particular order, Collection is too
general; you need List or SortedSet.
If you need to guarantee that duplicate entries cannot occur, you need a Set.
If you need to guarantee the performance characteristics of your collection,
you might require a particular implementation. For example, among Sets the
HashSet "offers constant time performance for the basic operations (add,
remove, contains and size), assuming the hash function disperses the elements
properly among the buckets."
TreeSet "guarantees that the sorted set will be in ascending element order,
sorted according to the natural order of the elements (see Comparable), or by
the comparator provided at set creation time, depending on which constructor
is used", but costs "log(n) time ... for the basic operations (add, remove and
contains)." (n is the set size.)
Others have mentioned that you declare the type that gives you the methods you
need; you also declare the type that gives you the behavior that you need.