I believe that it’s better to code to interfaces instead of implementations. In Java:
List<User> users = new ArrayList<User>();
There’s no need to specify the runtime type of users all over the program if the code only cares that it implements List.
However, I encounter many people who believe that it’s totally fine, even when they’re not using properties specific to the ArrayList:
ArrayList<User> users = new ArrayList<User>();
I try to explain that it’s redundancy and makes the program harder to change, but they don’t seem to care. Are there other reasons that this is important? Or perhaps my convictions are overstated?
Personally, I think that there are two parts to this argument.
If you’re returning an object from a method in a class, it should return the most generic object possible. In this case, if you had a choice between returning
ArrayList<User>orList<User>, returnList<User>because it makes life easier for the people consuming your class.If you’re coding inside of a method and you don’t mind hard-coding a concrete type, go for it. It’s not what I would do, and it will make your code more fragile in the future but since there are no outside dependencies on that concrete type (hence the first part), you’re not going to break anybody that is consuming your code.