Я удивительно никогда не понимал цели этого:
Map telephoneNumbers = new HashMap();
List<Object> list = new ArrayList<Object>();
вместо этого:
HashMap telephoneNumbers = new HashMap();
ArrayList<Object> list = new ArrayList<Object>();
?
Когда вы выполните:
HashMap telephoneNumbers = new HashMap();
ArrayList<Object> list = new ArrayList<Object>();
Вы привязаны к определенной реализации, то есть к ArrayList
. Если вы должны передать объект list
другим методам, то вы не очень гибки. Если вы запрограммируете интерфейс, скажите " Collection
(которая расширена List
), вы можете позже изменить ее реализацию. Например, если объекты в списке должны быть уникальными, то вы можете легко изменить его как Set
вместо (потому что наборы содержат только уникальные объекты):
HashMap telephoneNumbers = new HashMap();
Collection<Object> list = new HashSet<Object>();
Принцип программирования для интерфейса действительно связан с отношениями зависимостей. Он тесно связан с концепцией концепции инкапсуляции OO:
- Языковой механизм для ограничения доступа к некоторым компонентам объекта.
- Языковая конструкция, которая облегчает объединение данных с помощью методов (или других функций), работающих с этими данными.
Самый важный аспект заключается в том, что, следуя парадигме программирования-интерфейса, мы просим себя "что" может сделать класс, но не "как" он это сделает, что связано с фактической реализацией.
Используя ArrayList
вы тесно связываете свой код с классом ArrayList
. Если вы используете только общие методы, которые находятся в интерфейсе Collection
(add()
, remove()
т.д.), То определенно имеет смысл объявить ваш list
как интерфейс типа Collection
.
Первые два предложения абстрагируют реализацию ваших коллекций. Я имею в виду, вы знаете, что у вас есть карта и список, но вы не привязаны к определенной реализации.
С другой стороны, переменные phoneNumbers и список вынуждены использовать конкретную реализацию: HashTable и List в массиве.
Поэтому, если вы используете свой первый набор переменных, вы программируете на интерфейс, а не на реализацию, что является основным принципом ООП: что значит "программировать интерфейс"?
Одна из причин - упростить замену реализаций.
Предположим, вы хотите использовать TreeMap вместо HashMap, чтобы вы могли печатать номера телефонов в порядке. Или, возможно, вы хотите использовать LinkedList вместо ArrayList, чтобы вы могли быстрее вставлять/удалять/сортировать.
Если вы используете версию интерфейса (Map and List), вам нужно будет только внести эти изменения в одно место, где вы построили структуры данных.