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

Pierwszy wariant zapewnia większą elastyczność, ale czy to wszystko? Czy są jakieś inne powody, by je preferować? A co z wydajnością?Czy kolekcja jest lepsza niż lista odnośników?

+1

Kolekcja to interfejs implementowany przez LinkedList. Zawsze powinieneś wskazywać interfejs przy wdrażaniu. – emd

Odpowiedz

7

Są to decyzje projektowe, a jeden rozmiar zwykle nie pasuje do wszystkich. Również wybór tego, co jest używane wewnętrznie dla zmiennej członka, może (i zwykle powinno być) różnić się od tego, co jest wystawione na świat zewnętrzny.

W swojej strukturze środowisko kolekcjonowania Java nie zapewnia kompletnego zestawu interfejsów, które opisują właściwości bez ujawniania szczegółów implementacji. Jedyny interfejs opisujący wydajność, RandomAccess jest interfejsem znacznika i nawet nie rozszerza zakresu Collection lub nie wyświetla ponownie interfejsu API get(index). Więc nie sądzę, że jest dobra odpowiedź.

Zgodnie z ogólną zasadą, utrzymuję typ tak niespecyficzny, jak to możliwe, dopóki nie rozpoznaję (i nie udokumentuję) jakiejś cechy, która jest ważna. Na przykład, gdy tylko będę chciał wiedzieć, że zachowane zostało zamówienie reklamowe, zmieniłabym z Collection na List i udokumentuję, dlaczego to ograniczenie jest ważne. Podobnie, przejdź od List do LinkedList, jeśli powiemy, skuteczne usuwanie z przodu staje się ważne.

Jeśli chodzi o udostępnianie kolekcji w publicznych interfejsach API, zawsze staram się ujawniać tylko te kilka interfejsów API, które powinny zostać użyte; na przykład add(...) i iterator().

0

Są absolutnie równoważne. Jedynym powodem używania jednego z nich jest to, że jeśli chcesz później użyć funkcji listy, która istnieje tylko w klasie LinkedList, musisz użyć drugiej.

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

To jest złe, bo nie chcesz to odniesienie do odnoszą się powiedzieć o HashSet (jak HashSet realizuje również odbiór i tak robi wielu innych klasa jest w ramach zbiórki).

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

Jest to złe, ponieważ dobrą praktyką jest zawsze kodowanie interfejsu.

List list = new LinkedList();//good 

To jest dobre, ponieważ punkt 2 dni tak. (Always Program To an Interface)

+1

dlaczego korzystanie z listy jest dobre i korzystanie z kolekcji jest złe? – GraphicsToBe

+0

@GraphicsToBe sprawdź moją edycję :) – PermGenError

+1

@ Arrayblank Array nie jest kolekcją, a także Map nie jest kolekcją :) – PermGenError

1

Jasne. Jeśli na przykład java znajdzie i wdroży bardziej wydajną implementację dla kolekcji List, ale masz już interfejs API, który akceptuje tylko LinkedList, nie będziesz w stanie zastąpić implementacji, jeśli masz już klientów dla tego interfejsu API. Jeśli używasz interfejsu, możesz łatwo zastąpić implementację bez łamania interfejsów API.

2

Użyj najbardziej szczegółowych informacji o typach obiektów niepublicznych. Są to szczegóły implementacji i chcemy, aby nasze szczegóły implementacji były jak najbardziej szczegółowe i precyzyjne.

0

Moja ogólna zasada jest taka, że ​​musisz być tak dokładny, jak tego potrzebujesz w danym czasie (lub będzie to konieczne w najbliższej przyszłości, w granicach rozsądku). To prawda, jest to nieco subiektywne.

W przykładzie chciałbym zazwyczaj zadeklarować ją jako List tylko dlatego metody dostępne na Collection nie są bardzo silne, a rozróżnienie między List i innymi Collection (Map, Set, etc.) często logicznie znaczący.

Również w Javie 1.5+ nie używaj typów surowych - jeśli nie znasz typu, który będzie zawierać twoja lista, używaj przynajmniej List<?>.

+0

Jakiekolwiek powody przyjęcia? – ach