2012-02-27 25 views
14

Trong Java, làm cách nào để tạo Tập hợp cuối cùng được điền vào lúc xây dựng? Tôi muốn làm điều gì đó như sau:Tạo tập hợp được chuẩn bị sẵn trong Java

static final Set<Integer> NECESSARY_PERMISSIONS 
    = new HashSet<Integer>([1,2,3,6]); 

nhưng tôi không biết cú pháp thích hợp trong Java.

+2

tôi đề cử này mở lại vì có sự khác biệt tinh tế: đây hỏi đặc biệt cho trận chung kết trong khi người kia đối với mô hình chung. Ví dụ, một câu trả lời bao gồm 'Collections.unmodifiableSet()' sẽ phù hợp cho điều này nhưng không phải là câu trả lời khác. – demongolem

Trả lời

48

Hãy thử thành ngữ này:

import java.util.Arrays; 

new HashSet<Integer>(Arrays.asList(1, 2, 3, 6)) 
2
Set<String> s = new HashSet<String>() {{ 
    add("1"); add("2"); add("5"); 
}}; 
+4

Hãy nhận biết về [đôi brace khởi tạo hạn chế] (http://stackoverflow.com/questions/924285/efficiency-of-java-double-brace-initialization). – Xaerxess

+0

@Xaerxess Cảm ơn, tôi sẽ kiểm tra. –

7

Cách đơn giản nhất, sử dụng các lớp Java tiêu chuẩn, là

static final Set<Integer> NECESSARY_PERMISSIONS = 
    Collections.unmodifiableSet(new HashSet<Integer>(Arrays.asList(1, 2, 3, 6))); 

Nhưng bạn cũng có thể sử dụng một initializer tĩnh, hoặc uỷ thác cho một tĩnh tin phương pháp:

static final Set<Integer> NECESSARY_PERMISSIONS = createNecessaryPermissions(); 

Lưu ý unmodifiableSet wrapper, đảm bảo rằng tập liên tục của bạn thực sự là hằng số.

17

Bạn có thể xem xét sử dụng ổi của ImmutableSet:

static final Set<Integer> NECESSARY_PERMISSIONS = ImmutableSet.<Integer>builder() 
     .add(1) 
     .add(2) 
     .add(3) 
     .add(6) 
     .build(); 
static final Set<String> FOO = ImmutableSet.of("foo", "bar", "baz"); 

Trong số những thứ khác, đây là nhanh hơn đáng kể (và nhiều hơn nữa ~ 3 lần không gian hiệu quả) hơn HashSet.

+0

@Louis - Cảm ơn, tôi đã quên cú pháp đơn giản hóa đó. –

5

Sử dụng Google Guava thư viện bạn có thể sử dụng ImmutableSet, được thiết kế chính xác cho trường hợp này (giá trị không đổi):

static final ImmutableSet<Integer> NECESSARY_PERMISSIONS = 
     ImmutableSet.of(1,2,3,6); 

cách Old-trường (không có bất kỳ thư viện):

static final Set<Integer> NECESSARY_PERMISSIONS = 
     new HashSet<Integer>(Arrays.asList(1,2,3,6)); 
4

Bạn có thể làm điều này theo cách mà IMO tốt hơn và ngắn gọn hơn các ví dụ khác trong chủ đề này:

public static <T> Set<T> set(T... ts) { 
    return new HashSet<>(Arrays.asList(ts)); 
} 

sau khi nhập nó tĩnh bạn có thể viết một cái gì đó như thế này:

public static final Set<Integer> INTS = set(1, 2, 3); 
Các vấn đề liên quan