2011-08-09 31 views
38

Tôi đang tìm một lớp học từ Khung thu thập Java không cho phép các phần tử null.Cách giải quyết hạn chế JDK này?

Bạn có biết không?

+2

gì nên xảy ra? Nếu bạn chỉ muốn bỏ qua list.add (null), tôi sẽ làm cho một lớp con thực hiện yêu thích của bạn, ghi đè lên add() và kiểm tra giá trị null – leifg

+0

Có lẽ cách tốt hơn để làm điều đó là không bao giờ chèn null vào vị trí đầu tiên? Dung sai (và do đó bảo vệ chống lại) nulls thường là một thực tế kém. –

+6

@leifg Đừng chỉ ghi đè thêm mà còn addAll! Nếu không, bạn có thể đang ở trong một bất ngờ thú vị. – Voo

Trả lời

20

Hầu hết Queue triển khai (với ngoại lệ đáng chú ý là LinkedList) không chấp nhận null.

EnumSet là một mục đích đặc biệt nhằm thực hiện Set không cho phép các giá trị null.

+3

'EnumSet' chỉ hoạt động với Enumerations ... –

1

Hàm băm không cho phép khóa hoặc giá trị rỗng.

+7

lòng tốt của tôi, đó là một vụ nổ từ quá khứ! Nó không phải là ngay cả một 'Bộ sưu tập', không bao giờ nhớ một' Danh sách'. – fommil

47

Sử dụng Constraints:

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

từ Guava cho sự linh hoạt tối đa.

CẬP NHẬT: Hạn chế dung nham đã không được chấp nhận trong Release 15 - dường như không thay thế.

CẬP NHẬT 2: Hiện tại (Guava 19.0-rc2) Constrains vẫn còn ở đó và không còn được dùng nữa. Tuy nhiên, nó bị thiếu trong số Javadoc.

Tôi sợ rằng Javadoc là đúng như MapConstraint đã bị phản đối Release 19, quá

+5

+1 cho câu trả lời của bạn nhưng tôi muốn gắn bó với Java Framework;) – Stephan

+5

OK, sau đó tôi có thể cung cấp cho bạn, ví dụ: 'java.util.concurrent.ConcurrentSkipListSet' từ JDK. Hoặc 'Collections.newSetFromMap (ConcurrentHashMap mới ())'. – maaartinus

+2

Thật không may 'Constraints' bị phản đối và lên kế hoạch để loại bỏ trong ổi 16,0 :-( –

1

Bắt đầu here, the Collections API Page. Xem phần "Xem thêm". Theo các liên kết. Quyết định cho phép hoặc không cho phép null được thực hiện bởi lớp triển khai; chỉ cần làm theo các liên kết trong các phần "Xem thêm" khác nhau để đến các lớp triển khai (ví dụ, HashMap) rồi xem xét các phương thức chèn (thường là biến thể khi thêm, đẩy hoặc đặt) để xem triển khai đó có cho phép không.

12

Có một loạt các bộ sưu tập như vậy here.

+0

Đối dự án tương lai của tôi, tôi chắc chắn sẽ có một cái nhìn tại ổi! +1 – Stephan

4

Sử dụng Google Ổi vị từ (câu trả lời từ @Joachim Sauer bị phản đối)

//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())); 
Các vấn đề liên quan