CodeGym /Java Blog /अनियमित /जावा में Enum वर्ग
John Squirrels
स्तर 41
San Francisco

जावा में Enum वर्ग

अनियमित ग्रुप में प्रकाशित
नमस्ते! इस आर्टिकल में हम आपको Java Enums के बारे में बताने जा रहे हैं । कल्पना करें कि आपको निम्नलिखित कार्य दिया गया है: एक ऐसा वर्ग बनाएँ जो सप्ताह के दिनों को लागू करता हो । पहली नज़र में, यह बल्कि सीधा लगता है। आपका कोड कुछ इस तरह दिखेगा:

public class DayOfWeek {

   private String title;

   public DayOfWeek(String title) {
       this.title = title;
   }

   public static void main(String[] args) {
       DayOfWeek dayOfWeek = new DayOfWeek("Saturday");
       System.out.println(dayOfWeek);
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
ऐसा लगता है कि सब कुछ ठीक है, लेकिन एक समस्या है: आप DayOfWeek क्लास के कंस्ट्रक्टर को कोई भी टेक्स्ट पास कर सकते हैं। इसका मतलब है कि कोई व्यक्ति "मेंढक", "बादल" या "अज़ाज़ा 322" नामक सप्ताह का एक दिन बना सकता है। यह स्पष्ट रूप से वह व्यवहार नहीं है जिसकी हम अपेक्षा करते हैं, क्योंकि सप्ताह के केवल 7 वास्तविक दिन होते हैं, और उनमें से प्रत्येक का एक विशिष्ट नाम होता है। इसलिए, हमारा काम किसी तरह DayOfWeek वर्ग के लिए संभावित मूल्यों की सीमा को सीमित करना है । जावा 1.5 आने से पहले, डेवलपर्स को स्वतंत्र रूप से इस समस्या के लिए अपने स्वयं के समाधान का आविष्कार करना पड़ा, क्योंकि भाषा के पास पहले से तैयार समाधान नहीं था। उन दिनों, यदि प्रोग्रामर को मूल्यों की संख्या को सीमित करने की आवश्यकता होती थी, तो उन्होंने ऐसा किया:

public class DayOfWeek {

   private String title;

   private DayOfWeek(String title) {
       this.title = title;
   }

   public static DayOfWeek SUNDAY = new DayOfWeek("Sunday");
   public static DayOfWeek MONDAY = new DayOfWeek("Monday");
   public static DayOfWeek TUESDAY = new DayOfWeek("Tuesday");
   public static DayOfWeek WEDNESDAY = new DayOfWeek("Wednesday");
   public static DayOfWeek THURSDAY = new DayOfWeek("Thursday");
   public static DayOfWeek FRIDAY = new DayOfWeek("Friday");
   public static DayOfWeek SATURDAY = new DayOfWeek("Saturday");

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
यहाँ आपको ध्यान देना चाहिए:
  • निर्माता निजी है। यदि एक कंस्ट्रक्टर को निजी संशोधक के साथ चिह्नित किया गया है, तो इसका उपयोग ऑब्जेक्ट बनाने के लिए नहीं किया जा सकता है। और चूँकि क्लास में केवल एक कंस्ट्रक्टर है, कोई DayOfWeek ऑब्जेक्ट कभी भी नहीं बनाया जा सकता है।

    
    	public class Main {
    
       		public static void main(String[] args) {
          
           			DayOfWeek sunday = new DayOfWeek(); // Error!
       		}
    }
    

  • बेशक, कक्षा में सार्वजनिक स्थैतिक वस्तुओं की आवश्यक संख्या होती है , जिन्हें सही ढंग से प्रारंभ किया गया था (सप्ताह के दिनों के सही नामों का उपयोग करके)।

    इसने इन वस्तुओं को अन्य वर्गों में उपयोग करने की अनुमति दी।

    
    	public class Person {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = DayOfWeek.SUNDAY;
    
           			System.out.println(sunday);
      		 }
    }
    

    आउटपुट:

    DayOfWeek{शीर्षक = 'रविवार'}

यह दृष्टिकोण काफी हद तक समस्या का समाधान करता है। हमारे पास सप्ताह के 7 दिन हैं, और कोई भी नया दिन नहीं बना सकता है। यह समाधान जोशुआ बलोच ने अपनी पुस्तक इफेक्टिव जावा में प्रस्तुत किया था । वैसे, वह किताब बहुत अच्छी है और किसी भी जावा डेवलपर के लिए जरूरी है। एनम क्लास का उपयोग कैसे करें - 2जावा 1.5 की रिलीज के साथ, भाषा को ऐसी स्थितियों के लिए तैयार समाधान प्राप्त हुआ: जावा एनम्सजावा में एनम भी एक वर्ग है। इस तरह की समस्याओं को हल करने के लिए यह विशेष रूप से "ठीक-ठीक" है, यानी मूल्यों की एक निश्चित सीमित सीमा बनाना। जावा के रचनाकारों के पास पहले से ही तैयार उदाहरण थे (उदाहरण के लिए, सी में पहले से ही एनम था ), इसलिए वे सबसे अच्छा संस्करण बनाने में सक्षम थे।

तो जावा एनम क्या है?

आइए अपने DayOfWeek उदाहरण पर दोबारा गौर करें:

public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
अब यह बहुत आसान दिखता है :) आंतरिक रूप से, हमारे Enum में 7 स्थिर स्थिरांक हैं। और यह एक ऐसी चीज है जिसका उपयोग हम किसी प्रोग्राम को लागू करने के लिए कर सकते हैं। उदाहरण के लिए, आइए एक प्रोग्राम लिखें जो यह निर्धारित करता है कि एक छात्र को आज स्कूल जाने की आवश्यकता है या नहीं। हमारे छात्र का एक दैनिक शेड्यूल होगा, जिसे स्टूडेंट शेड्यूल क्लास द्वारा दर्शाया गया है:

public class StudentSchedule {

   private DayOfWeek dayOfWeek;
   // ... other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
शेड्यूल ऑब्जेक्ट का dayOfWeek चर निर्धारित करता है कि आज कौन सा दिन है। और यहाँ हमारा छात्र वर्ग है:

public class Student {

   private StudentSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {
      
       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("Hooray, you can sleep more!");
       } else {
           System.out.println("Damn, time for school again :(");
       }
   }
}
वेकअप () पद्धति में , हम जावा एनम का उपयोग यह निर्धारित करने के लिए करते हैं कि छात्र को आगे क्या करना चाहिए। हमने DayOfWeek में प्रत्येक क्षेत्र के बारे में विवरण भी नहीं दिया है , और हमें इसकी आवश्यकता नहीं है: यह स्पष्ट है कि सप्ताह के दिनों को कैसे कार्य करना चाहिए। यदि हम इसे इसके वर्तमान रूप में उपयोग करते हैं, तो कोई भी डेवलपर समझ जाएगा कि हमारे कोड में क्या हो रहा है। Enum की सुविधा का एक अन्य उदाहरण यह है कि इसके स्थिरांक का उपयोग स्विच स्टेटमेंट के साथ किया जा सकता है। उदाहरण के लिए, एक सख्त आहार के लिए एक कार्यक्रम लिखें, जिसमें दिन के हिसाब से व्यंजन निर्धारित हों:

public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("Sunday Dinner! You can even enjoy something a little sweet today.");
               break;
           case MONDAY:
               System.out.println("Lunch for Monday: chicken noodle soup!");
               break;
           case TUESDAY:
               System.out.println("Tuesday, today it's celery soup :(");
               break;
               //... and so on to the end
       }
   }
}
यह जावा 1.5 से पहले उपयोग किए गए पुराने समाधान पर Enums के लाभों में से एक है - पुराने समाधान का उपयोग स्विच के साथ नहीं किया जा सकता है । एनम के बारे में आपको और क्या जानने की जरूरत है ? Enum एक वास्तविक वर्ग है जिसमें सभी संभावनाएं हैं जो इसमें शामिल हैं। उदाहरण के लिए, यदि सप्ताह के दिनों का वर्तमान कार्यान्वयन अपर्याप्त है, तो आप DayOfWeek में चर, रचनाकार और विधियाँ जोड़ सकते हैं :

public enum DayOfWeek {
  
   SUNDAY ("Sunday"),
   MONDAY ("Monday"),
   TUESDAY ("Tuesday"),
   WEDNESDAY ("Wednesday"),
   THURSDAY ("Thursday"),
   FRIDAY ("Friday"),
   SATURDAY ("Saturday");

   private String title;

   DayOfWeek(String title) {
       this.title = title;
   }

   public String getTitle() {
       return title;
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
अब हमारे Enum स्थिरांक में एक शीर्षक फ़ील्ड, गेट्टर और ओवरराइड टूस्ट्रिंग विधि है। नियमित कक्षाओं की तुलना में, एनम पर एक गंभीर सीमा रखी गई थी - इसे इनहेरिट नहीं किया जा सकता है। इसके अतिरिक्त, गणनाओं में विशिष्ट तरीके हैं:
  • मान () : Enum में सभी मानों की एक सरणी लौटाता है :

    
    public static void main(String[] args) {
       		System.out.println(Arrays.toString(DayOfWeek.values()));
    }
    

    आउटपुट:

    [DayOfWeek {शीर्षक = 'रविवार'}, DayOfWeek {शीर्षक = 'सोमवार'}, DayOfWeek {शीर्षक = 'मंगलवार'}, DayOfWeek {शीर्षक = 'बुधवार'}, DayOfWeek {शीर्षक = 'गुरुवार'}, DayOfWeek {शीर्षक = 'शुक्रवार'}, DayOfWeek{शीर्षक = 'शनिवार'}]

  • ordinal() : स्थिरांक की क्रमिक संख्या लौटाता है। अंकन शून्य से शुरू होता है:

    
    	public static void main(String[] args) {
    
       		int sundayIndex = DayOfWeek.SUNDAY.ordinal();
       		System.out.println(sundayIndex);
    }
    

    आउटपुट:

    0

  • valueOf() : एनम ऑब्जेक्ट लौटाता है जो पास किए गए नाम से मेल खाता है:

    
    public static void main(String[] args) {
       DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY");
       System.out.println(sunday);
    }
    

    आउटपुट:

    DayOfWeek{शीर्षक = 'रविवार'}

टिप्पणी:Enum फ़ील्ड निर्दिष्ट करने के लिए हम अपरकेस अक्षरों का उपयोग करते हैं । ये स्थिरांक हैं इसलिए ये कैमलकेस के बजाय ऑल-कैप्स का उपयोग करते हैं ।
टिप्पणियां
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION