2012-02-27 4 views
14

में प्रीपोप्टेड सेट बनाना जावा में, मैं निर्माण पर आबादी वाला एक अंतिम सेट कैसे बना सकता हूं? मैं निम्नलिखित की तरह कुछ करना चाहता हूं:जावा

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

लेकिन मुझे जावा में उचित वाक्यविन्यास नहीं पता है। मानक जावा वर्गों का उपयोग कर

import java.util.Arrays; 

new HashSet<Integer>(Arrays.asList(1, 2, 3, 6)) 
+2

मैं फिर से खोलने क्योंकि वहाँ सूक्ष्म अंतर नहीं है के लिए यह मनोनीत: यह सामान्य प्रतिमान के लिए अंतिम जबकि अन्य के लिए विशेष रूप से पूछता है। उदाहरण के लिए, एक संग्रह जिसमें 'Collections.unmodifiableSet()' शामिल है, इसके लिए उचित होगा लेकिन दूसरे नहीं। – demongolem

उत्तर

48

इस मुहावरे का प्रयास करें विधि:

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

नोट करें unmodifiableSet रैपर, जो गारंटी देता है कि आपका निरंतर सेट वास्तव में स्थिर है।

2
Set<String> s = new HashSet<String>() {{ 
    add("1"); add("2"); add("5"); 
}}; 
+4

[डबल ब्रेस प्रारंभिक दोषों] से अवगत रहें (http://stackoverflow.com/questions/924285/efficiency-of-java- डबल- ब्रेस- प्रारंभिकरण)। – Xaerxess

+0

@Xaerxess धन्यवाद, मैं इसे देख लूंगा। –

7

सबसे आसान तरीका है,,

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

है लेकिन तुम भी एक निजी स्थिर करने के लिए एक स्थिर प्रारंभकर्ता उपयोग कर सकते हैं, या प्रतिनिधि:

17

आप विचार कर सकते हैं अमरूद के 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"); 

अन्य बातों के अलावा, यह काफी तेजी से होता है (और ~ 3 गुना अधिक अंतरिक्ष कुशल) HashSet से। आप कर सकते हैं

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

@ लुइस - धन्यवाद, मैं उस सरलीकृत वाक्यविन्यास के बारे में भूल गया। –

5

Google Guava पुस्तकालय का उपयोग करके आप ImmutableSet है, जो वास्तव में इस मामले बनाया गया है (स्थिर मान) का उपयोग कर सकते हैं:

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

पुराने स्कूल रास्ता (किसी भी पुस्तकालय के बिना) ऐसा निम्नलिखित तरीके से करें जो आईएमओ इस विषय में अन्य उदाहरणों की तुलना में काफी बेहतर और अधिक संक्षिप्त है:

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

यह आयात करने के बाद स्थिर आप कुछ इस तरह लिख सकते हैं:

public static final Set<Integer> INTS = set(1, 2, 3);