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, вы должны изменить свой контракт, если хотите изменить базовую реализацию.