Эта вики-статья о Принципе замены Лискова и Принципе разделения интерфейсов может помочь вам понять, почему вы должны программировать для интерфейсов.
При работе между доменами, что является распространенным явлением в разработке EE, вам много раз не важно, какой тип коллекции используется. Вы чаще всего хотите просто извлечь что-то из него, выполнить итерацию или удалить что-то. Ничто из этого не требует знания того, с какой реализацией вы имеете дело. Это также облегчит переключение базовой реализации. Например, предположим, что я работаю над проектом и загружаю список элементов из базы данных в ArrayList. В другом месте кода я перебираю этот список:
class DBUtil {
public static ArrayList<Item> getMeAllOfMyItems() {
return items; // load from database whatever...
}
}
... между тем ...
ArrayList<Item> items = DBUtil.getMeAllOfMyItems();
for (int i = 0; i < items.size(); i++) {
// do something with item
}
Теперь допустим, что я решил вместо этого использовать связанный список. Мне пришлось бы изменить метод, который загружал все из базы данных, а также код, который я использовал для его итерации:
class DBUtil {
public static LinkedList<Item> getMeAllOfMyItems() {
return items; // load from database whatever...
}
}
... между тем ...
LinkedList<Item> items = DBUtil.getMeAllOfMyItems();
for (int i = 0; i < items.size(); i++) {
// do something with item
}
Это было два изменения. Если бы я написал это изначально как:
class DBUtil {
public static List<Item> getMeAllOfMyItems() {
return items; // load from database whatever...
}
}
... между тем ...
List<Item> items = DBUtil.getMeAllOfMyItems();
for (int i = 0; i < items.size(); i++) {
// do something with item
}
Мне бы пришлось изменить только один метод, метод, в котором я возвращаю элементы из базы данных.
Еще лучше было бы изменить способ итерации элементов, чтобы использовать для каждого стиля:
class DBUtil {
public static List<Item> getMeAllOfMyItems() {
return items; // load from database whatever...
}
}
... между тем ...
List<Item> items = DBUtil.getMeAllOfMyItems();
for (Item i : items) {
// do something with item
}
Теперь, если бы я захотел, я мог бы даже изменить еще больше реализации, и пока все, что я использую, реализует Iterable, мне даже не важно, какой тип Collection использует базовая система.
Вы должны стремиться сделать вещи как можно более общими с намерением, что вам не нужно менять 3 или 4 файла из-за небольшого изменения в другом месте.