Ответ 1
Поскольку mymap может быть создан где-то в другом месте с другой реализацией Map
, вы не должны полагаться на то, что это экземпляр HashMap
в коде с его использованием.
У меня есть сомнения в методологии проектирования, почему мы внедряем код в интерфейс. Это очень заметно в примитивных типах данных. Как будто я не получаю разницу между этими двумя:
Map<Integer, String> mymap = new HashMap<Integer, String>();
и
HashMap<Integer, String> mymap = new HashMap<Integer, String>();
Есть ли разница между этими двумя? Я имею в виду, что все места, где мы будем использовать mymap
, останутся одинаковыми в обоих случаях.
Прошу прощения, если вопрос кажется бесполезным, но я действительно не понимаю, как это будет иметь значение позже, когда будет использоваться mymap
. Пожалуйста, помогите?
Спасибо..
Примечание. Я уже видел этот вопрос о SO, но он не дает того, что я хочу.
Поскольку mymap может быть создан где-то в другом месте с другой реализацией Map
, вы не должны полагаться на то, что это экземпляр HashMap
в коде с его использованием.
Вторая опция ограничивает вас всегда использовать HashMap, даже если какой-то день TreeMap может быть более полезным.
В первом вы можете изменить конкретную реализацию проще - вам нужно только изменить одну строку кода. Это особенно заметно, если вы возвращаете свою карту из методов - тип возвращаемого метода не должен изменяться.
Кодирование на интерфейс также помогает насмехаться над объектом во время тестов, но я предполагаю, что это не так.
Использование Map mymap
позволяет вам позже изменить реализацию. Например, если в какой-то момент вам нужно mymap
заказать, вы просто измените инициализацию на LinkedHashMap
.
Если вы используете это только в своем типе (значение: private) и создаете его самостоятельно, это не имеет особого значения.
Теперь становится интересным, если публичный интерфейс вашего типа предоставляет карту против HashMap.
В конкретном экземпляре, который вы предлагаете, это может не повлиять, но хорошая практика заключается в том, чтобы вы всегда использовали интерфейс в своих объявлениях, потому что есть законные экземпляры, в которых вам будет нужна, что гибкость.
Первая позволяет вам изменить на:
Map<Integer, String> mymap = new TreeMap<Integer, String>();
например, без нарушения всего остального кода.
Гораздо более незначительное преимущество заключается в том, что ваша среда IDE может показать вам методы для интерфейса, а не (потенциально гораздо большее число) методов для реализации.