Почему кодировка должна быть «к интерфейсу», особенно для примитивных типов данных? - PullRequest
0 голосов
/ 22 февраля 2012

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

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

И

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

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

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

Спасибо ..

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

Ответы [ 6 ]

4 голосов
/ 22 февраля 2012

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

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

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

1 голос
/ 22 февраля 2012

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

0 голосов
/ 22 февраля 2012

Первый позволяет вам изменить значение, например, на

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

, не нарушая весь остальной код.

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

0 голосов
/ 22 февраля 2012

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

0 голосов
/ 22 февраля 2012

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

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

0 голосов
/ 22 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...