Вопрос-ответ

Why should the interface for a Java class be preferred?

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

PMD сообщит о нарушении для:

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

Нарушением было "Избегайте использования типов реализации, таких как 'ArrayList'; используйте вместо этого интерфейс".

Следующая строка исправит нарушение:

List<Object> list = new ArrayList<Object>();

Почему последний с List следует использовать вместо ArrayList?

Переведено автоматически
Ответ 1

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

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

Вот хорошая статья на эту тему.

Надеюсь, это поможет!

Ответ 2

Это предпочтительнее, потому что вы отделяете свой код от реализации списка. Использование интерфейса позволяет вам легко изменить реализацию, ArrayList в данном случае, на другую реализацию list, не изменяя ничего из остального кода, если в нем используются только методы, определенные в List .

Ответ 3

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

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

Для интереса я провел эксперимент, который сгенерировал десять миллиардов последовательных обращений к списку массивов длиной 1 миллион. На моем MacBook с частотой 2,4 ГГц доступ к ArrayList через интерфейс списка занимал в среднем 2,10 секунды, при объявлении его типа ArrayList это занимало в среднем 1,67 секунды.

Если вы работаете с большими списками, глубоко внутри внутреннего цикла или часто вызываемой функции, то это стоит рассмотреть.

Ответ 4

ArrayList и LinkedList - это две реализации списка, который представляет собой упорядоченную коллекцию элементов. С точки зрения логики не имеет значения, используете ли вы ArrayList или LinkedList , поэтому вам не следует ограничивать этот тип.

This contrasts with say, Collection and List, which are different things (List implies sorting, Collection does not).

java collections