2013-06-12 4 views
2

Так много раз я видел, что создание экземпляра Arraylist осуществляется в порядке "Список <Object> listObject = new ArrayList <Object>()?

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

Итак, я задавался вопросом, что такое значение конкретизации Arraylist таким образом? Что произойдет, если мы создаем ArrayList() как

ArrayList<Object> listObject = new ArrayList<Object>(); 
+0

Вы можете посмотреть эту тему. http://stackoverflow.com/questions/2279030/type-list-vs-type-arraylist-in-java – dijkstra

+0

Возможный дубликат [Что означает «программа для интерфейса»?] (Http: // stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface) –

ответ

2

Это из-за того, что его всегда хорошая практика, чтобы написать код для интерфейса, а не для реализации. Поэтому, когда вы делаете List<Object> listObject = new ArrayList<Object>();, у вас всегда есть свобода менять ArrayList на LinkedList, а в другом месте в коде не потребуется никаких изменений. Таким образом, программирование для интерфейса (List) дает вам свободу/способность изменять базовую реализацию, не затрагивая другие места в коде.Я предлагаю вам прочитать this small note, чтобы получить больше ясности.

0

Там нет никакой разницы между реализациями списка в обоих ваших примерах. Там же, однако разница в способе, которым вы можете дополнительно использовать переменную MyList в вашем коде.

Когда ты определите свой список как:

List myList = new ArrayList(); 

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

ArrayList myList = new ArrayList(); 

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

Тем не менее, когда вы вызываете метод класса List в первом примере, который был переопределен в ArrayList, тогда метод из ArrayList будет вызываться не в списке.

Это называется полиморфизм.

+0

Вы действительно не объяснили * почему * это часто делается. –

7

List - это интерфейс, ArrayList класс - это конкретная реализация этого интерфейса.

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

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

List<Object> listObject = new LinkedList<Object>(); 

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

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

Это называется Программирование на интерфейс, а не на реализацию.

0

Это, «Программа для интерфейса, а не к реализации»

Пожалуйста, посмотрите на this и this

0

List - это интерфейс, а ArrayList - это класс. Лучшие практики говорят: Программа против интерфейсов, а не конкретных классов.

На самом деле не может быть разницы между этими двумя определениями (определяющими тип переменной как интерфейс vs class), но использование List делает ваш код зависимым от интерфейса, а не от класса. Затем вы можете изменить фактический тип переменной, не затрагивая код, который использует переменную.

0

Потому что вы можете использовать различные реализации одного и того же interface (в этом случае вы можете изменить реализацию списка к linkedList вместо ArrayList) без изменения кода.

Why should the interface for a Java class be preferred?

0

На Java 7 эти известные реализации List

Все известные исполнители Классы:
AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector

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

Также называется Coding to Interfaces, это широко используемая парадигма программирования.

+0

Из всего вышеизложенного я понял, что «Coding to Interface» дает нам свободу использовать различные реализации классов, реализующих этот интерфейс. Таким образом, это уменьшает накладные расходы, связанные с внедрением класса и его методов. Мы можем обменять между ними время выполнения. Как и здесь, мы можем использовать LinkedList также везде, где это требуется, чем Arraylist. –

+0

@ PankajDeshpande Пятно на! –

0

При использовании List вы используете Абстракция. Воображение случая, в котором есть вызов функция ожидает List<Object>

List<Object> myList = myFunction(); 

теперь в функции MYFUNCTION(), его лучше использовать

List<Object> myList = new ArrayList<Object>(); 
return myList; 

чем

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

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

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

0

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

0

Большинство ответов относится к мантре «кодирование интерфейса». Хотя это хороший совет, это может привести к некоторым проблемам. В частности, в случае List пользователь объекта listObject ничего не знал об эффективности базовой структуры данных. Например, если это экземпляр ArrayList, то получение последнего элемента - только O(1), а если это LinkedList, то это O(listObject.size).

Поэтому часто очень важно знать точную базовую структуру данных, которая может быть достигнута с использованием типа реализации для объявления переменной. Например, Scala's List - это класс, который делает его структуру данных явной.

Таким образом, я бы сказал, что, как всегда, решение должно быть информированным и соответствовать дизайну вашего приложения. Если структура данных должна быть «списком», и нет требований к конкретной реализации, то для объявления используется List. Однако, если набор алгоритмов, которые должны работать над этой структурой данных, хорошо известен, используйте конкретный класс реализации (то есть ArraysList, LinkedList), который обеспечил бы оптимальную производительность этих алгоритмов.

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