CodeGym /Java Blog /यादृच्छिक /जावा मध्ये एनम वर्ग
John Squirrels
पातळी 41
San Francisco

जावा मध्ये एनम वर्ग

यादृच्छिक या ग्रुपमध्ये प्रकाशित केले
हाय! या लेखात आम्ही तुम्हाला 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 वर्गाच्या कन्स्ट्रक्टरला पाठवू शकता . म्हणजे कोणीतरी "फ्रॉग", "क्लाउड" किंवा "azaza322" नावाचा आठवड्याचा दिवस तयार करू शकतो. हे स्पष्टपणे आपल्याला अपेक्षित असलेले वर्तन नाही, कारण आठवड्याचे फक्त 7 वास्तविक दिवस आहेत आणि त्या प्रत्येकाचे विशिष्ट नाव आहे. त्यामुळे, डेऑफवीक वर्गासाठी संभाव्य मूल्यांची श्रेणी कशी तरी मर्यादित करणे हे आमचे कार्य आहे . Java 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);
      		 }
    }
    

    आउटपुट:

    आठवड्याचा दिवस{शीर्षक = 'रविवार'}

हा दृष्टिकोन मोठ्या प्रमाणात समस्येचे निराकरण करतो. आमच्याकडे आठवड्याचे 7 दिवस आहेत आणि कोणीही नवीन तयार करू शकत नाही. हा उपाय जोशुआ ब्लोच यांनी त्यांच्या Effective Java या पुस्तकात दिला होता . तसे, ते पुस्तक खूप छान आहे आणि कोणत्याही Java विकसकासाठी वाचलेच पाहिजे. एनम क्लास - 2 कसे वापरावेJava 1.5 च्या रिलीझसह, भाषेने अशा परिस्थितींसाठी एक तयार उपाय प्राप्त केला: Java Enums . Java मधील Enum देखील एक वर्ग आहे. यासारख्या समस्यांचे निराकरण करण्यासाठी, म्हणजे मूल्यांची एक विशिष्ट मर्यादित श्रेणी तयार करणे हे विशेषत: "फाईन-ट्यून" आहे. Java च्या निर्मात्यांकडे आधीच तयार उदाहरणे होती (उदाहरणार्थ, C मध्ये आधीच enum होते ), त्यामुळे ते सर्वोत्तम प्रकार तयार करण्यात सक्षम होते.

तर जावा एनम म्हणजे काय?

चला आमच्या 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 :(");
       }
   }
}
wakeUp() पद्धतीमध्ये , विद्यार्थ्याने पुढे काय करावे हे ठरवण्यासाठी आम्ही Java Enum वापरतो. आम्ही DayOfWeek मध्ये प्रत्येक फील्डबद्दल तपशील देखील प्रदान केला नाही आणि आम्हाला याची आवश्यकता नाही: आठवड्याचे दिवस कसे कार्य करतात हे स्पष्ट आहे. आम्ही ते सध्याच्या स्वरूपात वापरल्यास, आमच्या कोडमध्ये काय चालले आहे ते कोणत्याही विकासकाला समजेल. एनमच्या सोयीचे आणखी एक उदाहरण म्हणजे त्याचे स्थिरांक स्विच स्टेटमेंटसह वापरले जाऊ शकतात. उदाहरणार्थ, कठोर आहारासाठी एक प्रोग्राम लिहूया, ज्यामध्ये डिश दिवसा शेड्यूल केल्या जातात:

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
       }
   }
}
Java 1.5 पूर्वी वापरल्या जाणार्‍या जुन्या सोल्यूशनपेक्षा एनम्सचा हा एक फायदा आहे — जुने सोल्यूशन स्विचसह वापरले जाऊ शकत नाही . एनमबद्दल तुम्हाला आणखी काय माहित असणे आवश्यक आहे ? एनम हा एक वास्तविक वर्ग आहे ज्यामध्ये सर्व शक्यता आहेत. उदाहरणार्थ, आठवड्याच्या दिवसांची सध्याची अंमलबजावणी अपुरी असल्यास, तुम्ही 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 + '\'' +
               '}';
   }
}
आता आमच्या एनम स्थिरांकांमध्ये शीर्षक फील्ड, गेटर आणि ओव्हरराइड टू स्ट्रिंग पद्धत आहे. नियमित वर्गांच्या तुलनेत, एनमवर एक गंभीर मर्यादा घातली गेली होती - ती वारशाने मिळू शकत नाही. याव्यतिरिक्त, गणनेमध्ये वैशिष्ट्यपूर्ण पद्धती आहेत:
  • values() : Enum मधील सर्व व्हॅल्यूजचा अ‍ॅरे देते :

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

    आउटपुट:

    [DayOfWeek{title = 'Sunday'}, DayOfWeek{title = 'Monday'}, DayOfWeek{title = 'Tuesday'}, DayOfWeek{title = 'Wednesday'}, DayOfWeek{title = 'Thursday'}, DayOfWeek{title = 'शुक्रवार'}, आठवड्याचा दिवस{शीर्षक = 'शनिवार'}]

  • ordinal() : स्थिरांकाची क्रमिक संख्या मिळवते. क्रमांकन शून्य पासून सुरू होते:

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

    आउटपुट:

    0

  • valueOf() : पास केलेल्या नावाशी संबंधित Enum ऑब्जेक्ट मिळवते:

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

    आउटपुट:

    आठवड्याचा दिवस{शीर्षक = 'रविवार'}

टीप:Enum फील्ड्स निर्दिष्ट करण्यासाठी आम्ही अप्परकेस अक्षरे वापरतो . हे स्थिरांक आहेत म्हणून ते CamelCase ऐवजी सर्व-कॅप्स वापरतात .
टिप्पण्या
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION