Where possible, use interfaces (as opposed to interface-implementation classes) to increase your source code’s flexibility. If you later need to change an interface-implementation class (to improve performance, for example), it’s a trivial matter to change a constructor call (or a call to a static factory method) as opposed to making many source code changes. Consider the following example.
List l = new ArrayList ();
In the above example, if the ArrayList-based implementation must be changed to an implementation based on a Vector, a LinkedList, or some other class that implements the List interface, it’s easy to change new ArrayList (); to new Vector ();, new LinkedList (); (and so on). No other source code needs to be changed.
If the example had declared ArrayList l = new ArrayList ();, called ArrayList-specific methods, and called a method with an ArrayList parameter, the single new ArrayList (); change would not be sufficient. However, by declaring variable l to be of interface type (List) as opposed to class and interface type (ArrayList), only a single change is neededand that increases your source code flexibility.