Какова цель программирования для интерфейса? [Дубликат]

1

Я удивительно никогда не понимал цели этого:

Map telephoneNumbers = new HashMap();
List<Object> list = new ArrayList<Object>();

вместо этого:

HashMap telephoneNumbers = new HashMap();
ArrayList<Object> list = new ArrayList<Object>();

?

Теги:
arraylist
hashmap
superclass

3 ответа

2

Когда вы выполните:

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.

  • 0
    Пример преимущества интерфейсов - было бы не так просто, если бы JsonObjectBuilder был классом.
2

Первые два предложения абстрагируют реализацию ваших коллекций. Я имею в виду, вы знаете, что у вас есть карта и список, но вы не привязаны к определенной реализации.

С другой стороны, переменные phoneNumbers и список вынуждены использовать конкретную реализацию: HashTable и List в массиве.

Поэтому, если вы используете свой первый набор переменных, вы программируете на интерфейс, а не на реализацию, что является основным принципом ООП: что значит "программировать интерфейс"?

1

Одна из причин - упростить замену реализаций.

Предположим, вы хотите использовать TreeMap вместо HashMap, чтобы вы могли печатать номера телефонов в порядке. Или, возможно, вы хотите использовать LinkedList вместо ArrayList, чтобы вы могли быстрее вставлять/удалять/сортировать.

Если вы используете версию интерфейса (Map and List), вам нужно будет только внести эти изменения в одно место, где вы построили структуры данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню