2013-03-19 2 views
5
Collection list = new LinkedList(); // Good? 
LinkedList list = new LinkedList(); // Bad? 

Первый вариант дает большую гибкость, но это все? Есть ли другие причины, чтобы предпочесть это? Как насчет производительности?Является ли коллекция лучше, чем LinkedList?

+1

Collection - это интерфейс, который реализован LinkedList. Вы должны всегда указывать интерфейс при реализации. – emd

ответ

7

Это проектные решения, и один размер обычно не подходит для всех. Также выбор того, что используется внутри для переменной-члена, может (и обычно должен) отличаться от того, что подвергается внешнему миру.

В основе своей каркас коллекций Java не предоставляет полный набор интерфейсов, которые описывают характеристики без раскрытия деталей реализации. Один интерфейс, который описывает производительность, RandomAccess является интерфейсом маркера и даже не расширяет Collection или повторно раскрывает API get(index). Поэтому я не думаю, что есть хороший ответ.

Как правило, я сохраняю тип как можно более неопределенный, пока не распознаю (и не документирую) некоторые важные характеристики. Например, как только я хочу, чтобы методы знали, что порядок вставки сохранен, я бы изменил с Collection на List и документировал, почему это ограничение имеет важное значение. Аналогично, перейдите от List к LinkedList, если говорить, что эффективное удаление спереди становится важным.

Когда дело доходит до публикации коллекции в общедоступных API-интерфейсах, я всегда стараюсь открыть только несколько API-интерфейсов, которые, как ожидается, будут использоваться; например add(...) и iterator().

0

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

2
Collection list = new LinkedList(); //bad 

Это плохо, потому что вы не хотите, чтобы это ссылка для обозначения говорит об HashSet (как HashSet также реализует коллекцию и так же много других класса в рамках коллекции).

LinkedList list = new LinkedList(); //bad? 

Это плохо, потому что хорошей практикой является всегда кодирование интерфейса.

List list = new LinkedList();//good 

Это хорошо, потому что точка 2 дня так. (Always Program To an Interface)

+1

Почему использовать List хорошо и использовать Collection is bad? – GraphicsToBe

+0

@GraphicsToBe check my edit :) – PermGenError

+1

@Aboutblank Array - это не коллекция, а также карта не является сборкой :) – PermGenError

1

Конечно. Если, например, java найдет и внедрит более эффективную реализацию для коллекции List, но у вас уже есть API, который принимает только LinkedList, вы не сможете заменить реализацию, если у вас уже есть клиенты для этого API. Если вы используете интерфейс, вы можете легко заменить реализацию, не нарушая API.

2

Используйте информацию о конкретном типе для непубличных объектов. Это детали реализации, и мы хотим, чтобы наши детали реализации были максимально конкретными и точными.

0

Мое общее правило должно быть таким же конкретным, как вам нужно быть в то время (или должно быть в ближайшем будущем, в пределах разумного). Конечно, это несколько субъективно.

В вашем примере я обычно объявим его как List только потому, что методы, доступные на Collection не очень мощный, и различие между List и другим Collection (Map, Set и т.д.) часто логически значимым.

Кроме того, в Java 1.5+ не используются исходные типы - если вы не знаете тип, который будет содержать ваш список, по крайней мере используйте List<?>.

+0

Любая причина для downvote? – ach