OOP: Разница между ArrayList al = new ArrayList() и List al = new ArrayList()?
Возможный дубликат:
Список против ArrayList
Разница между
ArrayList al = new ArrayList()
и
List al = new ArrayList() ?
Ответы
Ответ 1
Нет, с точки зрения создания. Оба создают экземпляр ArrayList
.
Различие заключается в том, что во втором примере al
разрешает доступ ко всем методам, реализованным в интерфейсе List
, в то время как в первом примере al
разрешает доступ ко всем (доступным) методам и полям ArrayList
класс.
Практическое эмпирическое правило: используйте второй шаблон. Если вам нужны дополнительные плюсы от реализации ArrayList
, вы всегда можете использовать:
List list = new ArrayList();
// do some adds/removes/... on the list
((ArrayList) list).trimToSize();
Ответ 2
Его называемое программированием для интерфейса. Предположим, вам нужно вернуть этот list
из вашего метода. Таким образом, вызывающий код может иметь это в переменной list
.
public ArrayList getList() {
ArrayList list = new ArrayList();
// do something with the list here
return list;
}
И это,
public List getList() {
List list = new ArrayList();
// do something with the list here
return list;
}
Теперь для последнего метода вызов кода может иметь возвращенный список в переменной list
type. И вы можете легко решить позже, почему-то, что-то вроде этого,
public List getList() {
List list = new LinkedList();
// do something with the list here
return list;
}
Никакого изменения кода вызова, в то время как с первым вам нужно изменить тип возврата, который в конечном итоге также испортит вызывающий код.
Ответ 3
Перефразируя мой ответ на этот очень похожий вопрос о Map
vs. HashMap
:
Нет никакой разницы между объектами. В интерфейсе, который у вас есть, есть разница. В первом случае интерфейс ArrayList
, а во втором - List
. Основной объект, тем не менее, тот же.
Преимущество использования List
заключается в том, что вы можете изменить базовый объект на другой тип списка, не нарушая контракт с любым кодом, который его использует. Если вы объявите его как ArrayList
, вы должны изменить свой контракт, если хотите изменить базовую реализацию.