1. पृष्ठभूमि कैसे enumबनी

आज हम जावा में एक अन्य प्रकार के डेटा प्रकार का पता लगाएंगे: enum. नाम enumशब्द गणना से आया है । यह डेटा प्रकार क्या है और इसके लिए क्या है?

कभी-कभी एक प्रोग्रामर को एक नया डेटा प्रकार बनाने की आवश्यकता होती है, जिसके संभावित मान एक छोटी निश्चित सूची तक सीमित होते हैं।

उदाहरण के लिए, एक DayOfTheWeekप्रकार केवल मान ले सकता है MONDAY, TUESDAY, WEDNESDAY, ... कुल 7 मान हैं। या एक Monthप्रकार केवल मान ही ले सकता है JANUARY, FEBRUARY, MARCH, ... कुल 12 मान हैं।

बेशक, आप संख्याओं ( intप्रकार) का उपयोग कर सकते हैं: 1- सोमवार, 2- मंगलवार, आदि। लेकिन कोई गलती से अमान्य मान जैसे 8या 0आपके चर को निर्दिष्ट कर सकता है।

आपके पास आसानी से ऐसी स्थिति हो सकती है जहां एक प्रोग्रामर सोचता है कि सप्ताह के दिन (या वर्ष के महीने) शून्य से शुरू होते हैं, जबकि अन्य उम्मीद करते हैं कि उनकी संख्या एक से शुरू हो, आदि।

यही कारण है कि जावा ने पेश किया enum, एक डेटा प्रकार जिसमें मूल्यों का एक सीमित सेट होता है ।


2. एक प्रकार की घोषणा करना

एक नया enumडेटा प्रकार घोषित करना इस तरह दिखता है:

enum TypeName
{
   VALUE1,
   VALUE2,
   VALUE3
}

नए प्रकार (वर्ग) का नाम कहां TypeNameहै, और संभावित मान अल्पविराम से अलग होते हैं और घुंघराले ब्रेसिज़ में लपेटे जाते हैं: Value1, Value2, Value3

एक उदाहरण के रूप में, आइए अपना स्वयं का बनाएँ DayOfTheWeek enum:

कोड टिप्पणी
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
नया Dayप्रकार

सोमवार
मंगलवार
बुधवार
गुरुवार
शुक्रवार
शनिवार
रविवार

यहां बताया गया है कि आप हमारे नए प्रकार के वेरिएबल को मान कैसे प्रदान करते हैं:

Day day = Day.MONDAY;

उदाहरण:

कोड टिप्पणी
Day day = Day.FRIDAY;
System.out.println(day);
स्क्रीन आउटपुट होगा:
FRIDAY


3. एक के तरीकेenum

एक enumप्रकार में कई अंतर्निहित विधियाँ होती हैं, जिनमें से दो बहुत ही रोचक हैं:

स्थैतिक values()विधि प्रकार के सभी मानों की एक सरणी लौटाती है enum:

कोड टिप्पणी
Day[] days = Day.values();

for (Day day: days)
   System.out.println(day);







System.out.println(days[2]);
चर daysएक सरणी को संग्रहीत करता है जिसमें प्रकार के मान होते हैं Day(7 तत्व)

स्क्रीन पर सरणी की सामग्री प्रदर्शित करें:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

विधि ordinal()स्थिरांक की क्रमिक संख्या लौटाती है। आप इसे कक्षा enumके बजाए मूल्य पर कहते हैं enum:

कोड कंसोल आउटपुट
System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.FRIDAY.ordinal());
System.out.println(Day.SUNDAY.ordinal());
0
4
6


4. एक वर्ग में परिवर्तित करना

वास्तव में, यहाँ कुछ भी जादुई नहीं है। कंपाइलर ने हमें कुछ सिंटैक्टिक चीनी दी है। संकलन समय पर, Dayएनम को एक साधारण वर्ग में बदल दिया जाता है:

कोड, सरलीकृत संस्करण टिप्पणी
public class Day
{
   public static final Day MONDAY = new Day(0);
   public static final Day TUESDAY = new Day(1);
   public static final Day WEDNESDAY = new Day(2);
   public static final Day THURSDAY = new Day(3);
   public static final Day FRIDAY = new Day(4);
   public static final Day SATURDAY = new Day(5);
   public static final Day SUNDAY = new Day(6);

    private static final Day[] array = {MONDAY, TUESDAY,
      WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};

   private final int value;

   private Day (int value)
   {
      this.value = value;
   }

   public int ordinal()
   {
      return this.value;
   }

   public static Day[] values()
   {
      return array;
   }
}
Day

स्थिर स्थिरांक की सूची एनुम के







सभी मूल्यों के साथ एक सरणी एक चर जो एक विशिष्ट वस्तु के मूल्य को संग्रहीत करता है वर्ग निजी है, जिसका अर्थ है कि वर्ग की वस्तुओं को केवल कक्षा के अंदर ही बनाया जा सकता है । किसी वस्तु पर विधि को बुलाया जाना चाहिए । यह वस्तु का मान - फ़ील्ड लौटाता है। विधि वर्ग के सभी मूल्यों के साथ एक स्थिर सरणी लौटाती हैDay


Day

DayconstructorDayDay



ordinalDay

value


Day

यदि हम कक्षा से सभी स्थिर विधियों और चरों को हटा देते हैं Day, तो हमें निम्नलिखित मिलते हैं:

कोड टिप्पणी
public class Day
{
  private int value;

  private Day (int value)
  {
    this.value = value;
  }

  public int ordinal()
  {
    return this.value;
  }
}


वेरिएबल स्टोर ऑब्जेक्ट valueके मान को केवल क्लास के अंदर ही बनाया जा सकता है , क्योंकि कंस्ट्रक्टर है । विधि वस्तु का रिटर्न करती है । Day

DayDayprivate




ordinal()valueDay

दूसरे शब्दों में, यहाँ कुछ भी डरावना नहीं हो रहा है। कंपाइलर Dayवर्ग बनाता है, स्थिरांक जोड़ता है जो enumमूल्यों का प्रतिनिधित्व करता है, आवश्यक विधियों को जोड़ता है, और वर्ग निर्माता बनाता है private। हम देखेंगे कि थोड़ी देर बाद कंस्ट्रक्टर कैसे काम करते हैं।

उम्मीद है, अब यह स्पष्ट हो गया है कि हम इस तरह एक चर के लिए मान क्यों निर्दिष्ट करते हैं:

Day day = Day.MONDAY;

MONDAYDayकक्षा में सिर्फ एक स्थिर क्षेत्र (स्थिर) है । क्लास के बाहर से स्टैटिक मेथड्स और फील्ड्स को एक्सेस करते समय, आपको फील्ड या मेथड के नाम से पहले क्लास का नाम बताना होगा।



5. एक के अधिक तरीकेenum

हर enumवर्ग में कई दिलचस्प विशेषताएं हैं।

एक स्ट्रिंग में और से कनवर्ट करना

एनम ऑब्जेक्ट को स्ट्रिंग में बदलने के लिए, आपको इसकी toString()विधि को कॉल करने की आवश्यकता है।

String str = Day.MONDAY.toString();

दूसरी दिशा में परिवर्तित करने के लिए (एक स्ट्रिंग से किसी Dayऑब्जेक्ट में), आप स्थिर valueOf()विधि का उपयोग कर सकते हैं:

Day day = Day.valueOf("MONDAY");

यह बेहद सुविधाजनक है और कई मामलों में मददगार होगा।

एक संख्या में परिवर्तित करना और फिर से वापस आना

enumआप पहले से ही जानते हैं कि किसी वस्तु को संख्या में कैसे बदलना है : ordinal()विधि को कॉल करें:

int index = Day.MONDAY.ordinal();

दूसरी दिशा में बदलने के लिए (किसी संख्या से किसी Dayवस्तु में), आपको अधिक पारदर्शी निर्माण की आवश्यकता है:

Day day = Day.values()[2];

उदाहरण:

कोड टिप्पणी
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
सोमवार
सोमवार का सूचकांक प्राप्त करें:
सप्ताह का 0 दिन सोमवार के 2 दिन बाद

महत्वपूर्ण बिंदु: क्योंकि enumमान स्थिरांक का एक निश्चित सेट है, उनकी तुलना == का उपयोग करके की जा सकती हैMONDAYदूसरे शब्दों में, आपके पास अलग-अलग पते वाली दो समान वस्तुएं नहीं हो सकती हैं । प्रत्येक एनम मान का केवल एक उदाहरण मौजूद है। और इसका मतलब है कि == का उपयोग करके एनम चर की तुलना करना हमेशा काम करेगा।



6. अपने स्वयं के तरीकों को एक में जोड़नाenum

क्योंकि enumसंकलन समय पर एक साधारण वर्ग में बदल जाता है, आप इसमें विधियों की घोषणा कर सकते हैं। इन विधियों को केवल उस वर्ग में जोड़ा जाता है जो संकलक उत्पन्न करता है। उदाहरण के लिए, मान लीजिए कि हम चाहते हैं Day enumकि हमारा ऐरे के बजाय एनम वैल्यू की एक सूची लौटाए।

फिर हम निम्नलिखित कोड जोड़ सकते हैं:

कोड टिप्पणी
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY;

   public static List<Day> asList()
   {
      ArrayList<Day> list = new ArrayList<Day>();

      Collections.addAll(list, values());

      return list;
   }

}








मूल्यों की सूची के बाद एक अर्धविराम आवश्यक है। एक वस्तु



बनाएँ विधि द्वारा लौटाए गए सरणी में मान जोड़ें । सूची को लौटें। ArrayList

values()

अब इस विधि को कोड में कहा जा सकता है:

कोड टिप्पणी
List<Day> list = Day.asList();
चर listके सभी मानों की एक सूची संग्रहीत करेगा Day enum