2011-08-09 18 views
38

Szukam klasy z Java Collection Framework, która nie zezwala na wartości NULL.Jak obejść to ograniczenie JDK?

Czy znasz jeden?

+2

Co się stało? Jeśli chcesz tylko zignorować list.add (null), utworzę podklasę twojej ulubionej implementacji, nadpisam add() i sprawdzę wartość pustą – leifg

+0

Być może lepszym sposobem na to jest nigdy nie wstawiać wartości null w pierwszej kolejności? Tolerowanie (i tym samym ochrona przed) wartościami null jest zwykle kiepską praktyką. –

+6

@leifg Nie tylko nadpisuj add, ale także addAll! W przeciwnym razie możesz spodziewać się interesującej niespodzianki. – Voo

Odpowiedz

20

Większość implementacji Queue (z wyraźnym wyjątkiem LinkedList) nie akceptuje null.

EnumSet to specjalna implementacja Set, która nie dopuszcza wartości null.

+3

'EnumSet' działa tylko z wyliczeniami ... –

1

Hashtable nie zezwala na puste klucze ani wartości.

+7

moja dobroć, to podmuch z przeszłości! To nawet nie jest "Kolekcja", nie mówiąc już o "liście". – fommil

47

Zastosowanie Constraints:

import com.google.common.collect.Constraints; 
... 
Constraints.constrainedList(new ArrayList(), Constraints.notNull()) 

z Guava maksymalnej elastyczności.

AKTUALIZACJA: Ograniczenia Guava zostały uznane za przestarzałe w Release 15 - najwyraźniej bez wymiany.

AKTUALIZACJA 2: Od tej chwili (Guava 19.0-rc2) Constrains jest nadal dostępny i nie jest przestarzały. Jednak go brakuje w Javadoc.

Obawiam się, że ma rację Javadoc jak MapConstraint były przestarzałe w Release 19 też

+5

+1 za odpowiedź, ale chcę trzymać się Java Framework;) – Stephan

+5

OK, a następnie mogę zaoferować np. 'java.util.concurrent.ConcurrentSkipListSet' od JDK. Lub 'Collections.newSetFromMap (new ConcurrentHashMap ())'. – maaartinus

+2

Niestety, 'Ograniczenia' są nieaktualne i zaplanowane do usunięcia w Guava 16.0 :-( –

1

start here, the Collections API Page. Sprawdź sekcję "Zobacz także". Śledź linki. Decyzja o zezwoleniu lub zabronieniu jest podejmowana przez klasę implementującą; po prostu podążaj za łączami w różnych sekcjach "Zobacz także", aby dostać się do klas implementujących (na przykład HashMap), a następnie spójrz na metody wstawiania (zazwyczaj odmiany na dodawanie, pchanie lub wstawianie), aby sprawdzić, czy ta implementacja umożliwia null.

12

Jest zbiórka takich kolekcji here.

+0

moje przyszłe projekty Zdecydowanie rzucę okiem na Guava! +1 – Stephan

4

Korzystanie z Google Guava predykaty (odpowiedź z @Joachim Sauer jest przestarzała)

//list is the variable where we want to remove null elements 
List nullRemovedList=Lists.newArrayList(Iterables.filter(list, Predicates.notNull())); 

//Or convert to Immutable list 
List nullRemovedList2=ImmutableList.copyOf(Iterables.filter(list, Predicates.notNull()));