2012-05-26 2 views

ответ

4

Да есть разница

с

List<Integer> iL ; 

Вы можете сделать

iL = new ArrayList<Integer>(); 

, а также

iL = new LinkedList<Integer>(); 

Преимущества:

Вы можете обратиться к любому другому объекту, который являетсяList


Смотрите также

+0

Я нахожу этот аргумент немного пустым. Если я напишу 'final List l = new ArrayList ', то я, очевидно, не буду ссылаться ни на что другое, кроме 'ArrayList'. Используя 'ArrayList' как параметр или возвращаемое значение общественного метода, это ** является смертельным грехом. –

+0

@ Марко да, это имеет смысл, если это окончательно, но в целом его нет, вот где мы воспользуемся заменой –

+0

Да, но 90% всех местных варов (особенно типизированных в коллекции), которые вы когда-либо видели, являются окончательными по своей природе , просто никто не мешает им «финал». –

2

Да. Во втором случае stuff может быть только ArrayList. В первом случае iL может быть экземпляром любого класса, который реализует интерфейс List.

3

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

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

1

Да. И это выходит за рамки просто «стиль кодирования» вопрос другие ответы педалирование ...

ArrayList имеет больше методов, чем List интерфейс обеспечивает (например trimToSize()), поэтому объявить переменную как ArrayList дает вам доступ к эти методы.

В общем случае, если вам не нужен доступ к этим специальным методам, лучше объявить его как List, следуя шаблону объявления абстрактного класса по предпочтению конкретному (позволяя вам поменять реализации по желанию, например используя вместо этого LinkedList)

1

У меня есть доступ к функциям списка и т. д., это список.

1

Помимо всех этих стандартных ответов «программа для интерфейса» и т. Д., Написание ArrayList, где вы могли бы написать List, просто уродливое, поэтому вам лучше повод для этого - и 99% времени там не будет.

1

Есть несколько различий при использовании интерфейса в объявлении:

  • Обозначает что минимально важно. Если вам нужны специальные методы, доступные только в конкретном подклассе, объявите его как таковой.
  • Позволяет менять в другой реализации (LinkedList или CopyOnWriteList) с минимальными изменениями.
  • Tiny штраф за исполнение из-за полиморфизма.

Учитывая вышеизложенное, объявляйте параметр метода и возвращаемые типы, используя интерфейс, чтобы скрыть несущественные детали реализации и минимизировать ограничения. Объявлять локальные переменные, используя фактический класс, только если производительность равна ultra-critical или если вам нужны дополнительные методы, которые она предоставляет. Если позже вы выберете другой конкретный класс, вам нужно будет изменить вызов на конструктор, который, вероятно, будет в той же строке, что и декларация.

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