2015-08-20 4 views
11

EnumSet<E> वर्ग के रूप में परिभाषित किया गया है। इसके अलावा, कक्षाओं के स्वचालित रूप से लागू होने वाली अधिकांश विधियां स्थिर हैं। अंत में, कक्षा add(), iterator(), remove(), size(), या isEmpty() विधियों को लागू करने लगती प्रतीत नहीं होती है और उन्हें केवल सार तत्व से प्राप्त होती है जो उन्हें लागू नहीं करती है।java.util.EnumSet <E> कैसे काम करता है?</p> <pre><code>public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E> implements Cloneable, Serializable </code></pre> JCF में <p>:

  1. EnumSet वस्तुओं वास्तव में किस प्रकार instantiated और उपयोग किया जाता है: मैं दो प्रश्न हैं?
  2. मैं EnumSet वस्तुओं के लिए add() विधि का प्रयोग क्यों कर सकते हैं?

उत्तर

16

स्थिर तरीकों आप देख के अधिकांश कारखाने विधियों (of(), complementOf(), allOf(), आदि) कर रहे हैं।

इन विधियों EnumSet का एक उदाहरण लौट आते हैं। बनाया है और इन तरीकों द्वारा दिया EnumSet के वास्तविक प्रकार EnumSet (RegularEnumSet, JumboEnumSet) है, जो सार्वजनिक एपीआई का हिस्सा नहीं हैं की एक उपवर्ग है, लेकिन सभी आवश्यक तरीकों को लागू। आपको केवल यह जानने की जरूरत है कि वे EnumSet को लागू करते हैं।

8

एनमसेट एक अमूर्त वर्ग है, इसलिए इसे प्राप्त होने वाले किसी भी अमूर्त तरीकों को लागू करने की आवश्यकता नहीं है। यह उस गैर जिम्मेदार उप-वर्गों की ज़िम्मेदारी पास करता है।

आप अनुपूरक तरीकों को कॉल कर सकते हैं क्योंकि आप वास्तव में उन्हें EnumSet के उप-वर्ग के उदाहरण पर बुला रहे हैं। (EnumSet सार है, यह सीधे ही instantiated नहीं किया जा सकता।)

+0

आप को शामिल करना चाहिए कि EnumSet इंटरफ़ेस लागू करता AbstractSet लागू करता है। यह बीमा करता है कि(), iterator(), निकालें(), ... EnumSet के अनुबंध में है। – Taemyr

4
import java.util.*; 
enum Foo { 
    A, B 
} 
class a { 
    public static void main(String[] args) { 
    System.out.println(EnumSet.noneOf(Foo.class)); 
    System.out.println(EnumSet.of(Foo.A)); 
    System.out.println(EnumSet.of(Foo.A).getClass()); 
    } 
} 

यह प्रिंट:

[] 
[A] 
class java.util.RegularEnumSet 

कार्यान्वयन का संबंध है, this लिंक एक विवरण प्रदान करता है:

EnumSet एक अमूर्त वर्ग है और यह दो ठोस कार्यान्वयन, java.util.RegularEnumSet और java.util.JumboEnumSet प्रदान करता है। RegularEnumSet और JumboEnumSet के बीच मुख्य अंतर यह है कि long वैरिएबल का उपयोग तत्वों को स्टोर करने के लिए करता है जबकि बाद में long[] से अपने तत्व को संग्रहीत करता है। चूंकि RegularEnumSetlong वैरिएबल का उपयोग करता है, जो 64 बिट डेटा प्रकार है, यह केवल उस तत्व को पकड़ सकता है। यही कारण है कि जब एक खाली EnumSetEnumSet.noneOf() पद्धति का उपयोग करके बनाया जाता है, यह RegularEnumSet चुनें यदि कुंजी ब्रह्मांड (कुंजी Enum में enum उदाहरणों की संख्या) 64 और JumboEnumSet के बराबर या उससे कम है अगर कुंजी ब्रह्मांड से अधिक 64

है

इसका क्या अर्थ है कि EnumSet आपके लिए सही कार्यान्वयन का चयन करेगा।

1
  1. वास्तव में किस प्रकार EnumSet वस्तुओं instantiated और उपयोग किया जाता है?

EnumSet एक "अमूर्त वर्ग" है और HashSet से पसंद किया जाता है आप "कुंजी" है कि यह पहले से जाना जाता है की एक संख्या है जब। उदाहरण के लिए जब आपके पास कॉन्फ़िगरेशन कुंजी होती है।

प्रदर्शनकी तुलना में बेहतर HashSet "क्योंकि रहे हैं ... के बाद से Enum स्थिरांक अद्वितीय हैं और पहले से परिभाषित किया गया है लंबाई, आप क्रम में एक नया enum निरंतर परिभाषित नहीं कर सकते हैं, यह करने के लिए जावा एपीआई डिजाइनर की अनुमति देता है अत्यधिक अनुकूलित EnumSet ... "(और अधिक पढ़ें: http://javarevisited.blogspot.com/2014/03/how-to-use-enumset-in-java-with-example.html#ixzz3jNcyB8ve)

आप, कारखाने विधि का एक बहुत कुछ के साथ का दृष्टांत कर सकते हैं, उदाहरण के लिए EnumSet.of (...)

  1. मैं EnumSet ऑब्जेक्ट्स के लिए add() विधि का उपयोग क्यों कर सकता हूं?

के बाद आप एक "EnumSet" बनाया है वस्तु आप रन-टाइम में जोड़ सकते हैं के साथ एक और तत्व विधि "जोड़ें"। यदि आपके पास उदाहरण के लिए कॉन्फ़िगरेशन कुंजियों की एक सूची है, तो आप "चयनित" कुंजी EnumSet द्वारा प्रस्तुत कर सकते हैं और उन्हें रनटाइम पर जोड़ सकते हैं।

package sample.test; 
import java.util.EnumSet; 

public class Foo { 

    public enum SimpleConfigEnum { KEY1, KEY2, KEY3}; 

/** 
* Example of EnumSet with add 
*/ 
public static void main(String[] args) { 

    //Create an enumSet with two elements: KEY1,KEY2 
    EnumSet<SimpleConfigEnum> eSet = EnumSet.of(SimpleConfigEnum.KEY1, SimpleConfigEnum.KEY2); 
    System.out.println(eSet); 

    //... add another element --> KEY3 
    eSet.add(SimpleConfigEnum.KEY3); 
    System.out.println(eSet); 
    } 

} 

उत्पादन होता है:

[KEY1, KEY2] 
[KEY1, KEY2, KEY3] 
संबंधित मुद्दे