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

71
задан Cœur 4 April 2017 в 09:41
поделиться

7 ответов

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

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

Вот хорошая статья о предмете.

Hope это помогает!

79
ответ дан kolrie 24 November 2019 в 13:02
поделиться

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

29
ответ дан AdamC 24 November 2019 в 13:02
поделиться

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

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

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

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

12
ответ дан Jason Plank 24 November 2019 в 13:02
поделиться

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

Это контрастирует с, говорят, Набор и Список, которые являются разными вещами (Список подразумевает сортировку, Набор не делает).

6
ответ дан SCdF 24 November 2019 в 13:02
поделиться

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

Однако...

В локальных объявлениях переменных, имеет мало смысла делать это:

public void someMethod() {
List theList = new ArrayList();
//do stuff with the list
}

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

1
ответ дан Jason Plank 24 November 2019 в 13:02
поделиться

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

1
ответ дан Diastrophism 24 November 2019 в 13:02
поделиться

В целом для Вашей строки кода не имеет смысла беспокоиться интерфейсами. Но, если мы говорим о API существует действительно серьезное основание. Я добрался, маленький класс

class Counter {
    static int sizeOf(List<?> items) {
        return items.size();
    }
}

В этом случае является использованием требуемого интерфейса. Поскольку я хочу считать размер каждое возможное реализация включая мое собственное. class MyList extends AbstractList<String>....

1
ответ дан Jason Plank 24 November 2019 в 13:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: