объявление переменной: почему интерфейс - PullRequest
2 голосов
/ 09 октября 2011

В последнее время я выполняю синтаксический анализ саксофона в Java . Я заметил инициализацию для сопоставлений пространства имен

private Map<String,String> namespaceMappings = new HashMap<String,String>();

мой вопрос, почему мы создаем Map переменную вместо HashMap здесь?
Кроме того, если у меня будет поле getNamespaceMappings , какой тип я должен возвращать?

public Map<String,String> getNamespaceMappings() {
    return namespaceMappings;
}

или

public HashMap<String,String> getNamespaceMappings() {
    return (HashMap<String,String>) namespaceMappings;
}

или

public Map<String,String> getNamespaceMappings() {
    return (HashMap<String,String>) namespaceMappings;
}

1 Ответ

5 голосов
/ 09 октября 2011

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

Например, если в какой-то момент выЕсли вы решите, что хотите использовать TreeMap вместо HashMap, вам нужно всего лишь изменить:

private Map<String,String> namespaceMappings = new HashMap<String,String>();

на:

private Map<String,String> namespaceMappings = new TreeMap<String,String>();

Никаких других изменений не требуется вкод.

Максимальное значение, которое вы получите от этого, - то, что ваш класс обнародует.Например, если у вас есть метод getNamespaceMappings(), возвращающий Map, то каждый фрагмент кода, использующий этот метод, просто будет знать, что он будет использовать Map.Если в какой-то момент вы решите внутренне представить эту карту как что-то отличное от HashMap, то вы сохраните это внутренне для своего класса.

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

...