2013-10-04 2 views
1

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

Как: List<Object> list = new ArrayList<Object>();

Но, используя ArrayList<Object> list = new ArrayList<Object>(); будет также делает ту же работу, не так ли?

+0

причина полиморфизм – gjman2

+1

я ждал этого, чтобы взорваться: D – MadProgrammer

+0

возможно дубликат http://stackoverflow.com/questions/4062982/java-oop-list-versus-arraylist-as-reference-type –

ответ

6

Да, но если вы позже передумаете и воспользуетесь LinkedList, то вам нужно изменить гораздо больше в своем коде.

2

При определении списка, как:

List myList = new ArrayList(); 

вы можете только вызывать методы и эталонные элементы, которые принадлежат к списку классов. Если определить его как:

ArrayList myList = new ArrayList(); 

вы будете иметь возможность ссылаться на ArrayList конкретные методы и использование ArrayList конкретных пользователей в дополнение к тем, которые унаследовали из списка. Тем не менее, когда вы вызываете метод класса List в первом примере, который был переопределен в ArrayList, тогда метод из ArrayList будет вызываться не в списке. Также первое имеет то преимущество, что реализация списка может измениться (например, на LinkedList), не затрагивая остальную часть кода. Это будет трудно сделать с ArrayList не только потому, что вам нужно будет изменить ArrayList на LinkedList везде, но также и потому, что вы, возможно, использовали ArrayList определенные методы.

3

Это Полиморфизм, который является основной концепцией ООП.

Это означает «состояние большого количества форм» или «способность принимать различные формы». При применении к ООП он описывает способность языка обрабатывать объекты разных типов и классов с помощью единого единообразного интерфейса.

List является унифицированным интерфейсом и его различные реализации, как ArrayList ,LinkedList ..... и т.д.

Предпочитает читать: What does it mean to program to a interface?

1

Там полезный принцип: для заявленных типов, используйте лузовой (смутный) возможно интерфейс (и List является «более свободным», чем ArrayList).

На практике это означает, что если вам нужно только для доступа к методам, объявленным в List<Object> в списке экземпляра (который на самом деле является ArrayList), а затем объявить его как List<Object>. Это означает, что вы можете изменить свое мнение на точный тип списка позже, и вам нужно только изменить строку, которая фактически создает экземпляр ArrayList (или LinkedList или что бы вы ни выбрали).

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

Просьба ознакомиться с Polymorphism, если вы хотите узнать больше.

связанных тангенциально является Лисков принцип замещения:

What is the Liskov Substitution Principle?

1

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

Например: С Animal interface или super class вы всегда можете получить определенные интерфейсы или calsses как Lion, но не по-другому, becaus его правда, что Лев это животное, а несколько других животных, не могут быть получены из Lion. Вот почему рекомендуется делать вещи вообще и, следовательно, использовать interfaces. То же самое относится и к вашему делу. Вы всегда можете получить ArrayList и другие реализации от List.

1

Скажем, у вас есть класс со следующим методом

public ArrayList<T> foo (ArrayList<T> someInput) { 

    //Do some operations on someInput here... 

    return someOutput; 

} 

Теперь, что произойдет, если изменить программу таким образом, что он использует LinkedList объекты вместо ArrayList объектов? Вы получите ошибку компилятора везде, где этот метод вызывается, и вам придется пройти и реорганизовать свой код, чтобы он принимал объекты LinkedList.

Если вы запрограммировали на интерфейс и использовать список вместо:

public List<T> foo (List<T> someInput) { 

    //Do some operations on someInput here.... 

    return someOutput; 

} 

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

Смежные вопросы