Почему кодирование должно быть "интерфейсом", особенно для примитивных типов данных?

У меня есть сомнения в методологии проектирования, почему мы внедряем код в интерфейс. Это очень заметно в примитивных типах данных. Как будто я не получаю разницу между этими двумя:

Map<Integer, String> mymap = new HashMap<Integer, String>(); 

и

HashMap<Integer, String> mymap = new HashMap<Integer, String>();

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

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

Спасибо..

Примечание. Я уже видел этот вопрос о SO, но он не дает того, что я хочу.

Ответ 1

Поскольку mymap может быть создан где-то в другом месте с другой реализацией Map, вы не должны полагаться на то, что это экземпляр HashMap в коде с его использованием.

Ответ 2

Вторая опция ограничивает вас всегда использовать HashMap, даже если какой-то день TreeMap может быть более полезным.

В первом вы можете изменить конкретную реализацию проще - вам нужно только изменить одну строку кода. Это особенно заметно, если вы возвращаете свою карту из методов - тип возвращаемого метода не должен изменяться.

Кодирование на интерфейс также помогает насмехаться над объектом во время тестов, но я предполагаю, что это не так.

Ответ 3

Использование Map mymap позволяет вам позже изменить реализацию. Например, если в какой-то момент вам нужно mymap заказать, вы просто измените инициализацию на LinkedHashMap.

Ответ 4

Если вы используете это только в своем типе (значение: private) и создаете его самостоятельно, это не имеет особого значения.

Теперь становится интересным, если публичный интерфейс вашего типа предоставляет карту против HashMap.

Ответ 5

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

Ответ 6

Первая позволяет вам изменить на:

Map<Integer, String> mymap = new TreeMap<Integer, String>(); 

например, без нарушения всего остального кода.

Гораздо более незначительное преимущество заключается в том, что ваша среда IDE может показать вам методы для интерфейса, а не (потенциально гораздо большее число) методов для реализации.