Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why are variables declared with their interface name in Java? [duplicate]

This is a real beginner question (I'm still learning the Java basics).

I can (sort of) understand why methods would return a List<String> rather than an ArrayList<String>, or why they would accept a List parameter rather than an ArrayList. If it makes no difference to the method (i.e., if no special methods from ArrayList are required), this would make the method more flexible, and easier to use for callers. The same thing goes for other collection types, like Set or Map.

What I don't understand: it appears to be common practice to create local variables like this:

List<String> list = new ArrayList<String>();

While this form is less frequent:

ArrayList<String> list = new ArrayList<String>();

What's the advantage here?

All I can see is a minor disadvantage: a separate "import" line for java.util.List has to be added. Technically, "import java.util.*" could be used, but I don't see that very often either, probably because the "import" lines are added automatically by some IDE.

like image 537
Zilk Avatar asked Sep 27 '09 20:09

Zilk


2 Answers

When you read

List<String> list = new ArrayList<String>();

you get the idea that all you care about is being a List<String> and you put less emphasis on the actual implementation. Also, you restrict yourself to members declared by List<String> and not the particular implementation. You don't care if your data is stored in a linear array or some fancy data structure, as long as it looks like a List<String>.

On the other hand, reading the second line gives you the idea that the code cares about the variable being ArrayList<String>. By writing this, you are implicitly saying (to future readers) that you shouldn't blindly change actual object type because the rest of the code relies on the fact that it is really an ArrayList<String>.

like image 61
mmx Avatar answered Oct 30 '22 00:10

mmx


Using the interface allows you to quickly change the underlying implementation of the List/Map/Set/etc.

It's not about saving keystrokes, it's about changing implementation quickly. Ideally, you shouldn't be exposing the underlying specific methods of the implementation and just use the interface required.

like image 7
Mike Cornell Avatar answered Oct 29 '22 22:10

Mike Cornell