Why store ArrayList object on List variable?
You might have seen something like this:
List<Movie> listOfMovies = new ArrayList<Movie>()
here we are using a List as a type of variable to store an object of ArrayList class, created using new() operator. This is known as programming for the interfaces. In fact, everywhere you need to declare a reference variable, you should always use the supertype e.g. Map for passing HashMap, Set for passing HashSet and List for passing ArrayList, LinkedList or Vector. You should use interface as type on the return type of method, type of arguments etc as shown below? Now big question comes, Why should you do that?
The answer is to take advantage of Polymorphism. If you use interface than in future if the new implementation is shipped then you are not required to change your program. For example, any program written using List will work as expected whether you pass a LinkedList, Vector or ArrayList, because they all implements List interface, they obey the contract exposed by List interface.
The only difference comes in performance, which is actually on of the driver for change. In short, if you program using interface, tomorrow if a better implementation of your interface is available then you can switch to that without making nay further change on the client side (part of the program which uses that interface).
Similarly, you should use interface type on method arguments:
public void sort(List<? extends Comparable> input){
// logic to sort the list
}
and use interface type on the return type of methods:
public List<Employee> getEmployees(int departmentId){
// logic to return employees for a given department
}
If you store ArrayList's object into a reference type of ArrayList, as shown below then your code will not work if you pass a LinkedList, because ArrayList IS NOT a LinkedList.
public List<Movies> getMovies(LinkedList<String> actors){
// this code will not work if you pass ArrayList
}
but following code will work, even if you pass ArrayList, Vector, CopyOnWriteArrayList or LinkedList, because it expects a List, which is an interface:
public List<Movies> getMovies(List<String> actors){
// this code will work if you pass ArrayList, Vector etc
}
Your program is pretty much hard coded, it lack the flexibility offered by Polymorphism and Inheritance. This answer is also applicable to questions like difference between Map and HashMap or Set and HashSet because ultimately they are the same question, the difference between interface and their implementation. You must follow SOLID principles to write a better program in object oriented programming languages like Java or C++.
Here are 10 object oriented principles Every Java Developer should know
