enum1. कसे झाले याची पार्श्वभूमी

आज आपण Java मधील डेटा प्रकाराचा आणखी एक प्रकार शोधू: enum. हे नाव गणनाenum या शब्दावरून आले आहे . हा डेटा प्रकार काय आहे आणि तो कशासाठी आहे?

कधीकधी प्रोग्रामरला नवीन डेटा प्रकार तयार करण्याची आवश्यकता असते, ज्याची संभाव्य मूल्ये एका लहान निश्चित सूचीपर्यंत मर्यादित असतात.

उदाहरणार्थ, एक DayOfTheWeekप्रकार फक्त मूल्ये घेऊ शकतो MONDAY, TUESDAY, WEDNESDAY, ... एकूण 7 मूल्ये आहेत. किंवा एक Monthप्रकार फक्त मूल्ये घेऊ शकतो JANUARY, FEBRUARY, MARCH, ... एकूण 12 मूल्ये आहेत.

अर्थात, तुम्ही शक्य संख्या ( intप्रकार) वापरता: 1— सोमवार, 2— मंगळवार, इ. पण कोणीतरी चुकून तुमच्या व्हेरिएबल 8सारखी अवैध मूल्ये नियुक्त करू शकतात.0

तुमच्याकडे सहज अशी परिस्थिती असू शकते जिथे एका प्रोग्रामरला असे वाटते की आठवड्याचे दिवस (किंवा वर्षाचे महिने) शून्यापासून क्रमांकित केले जातात, तर इतरांना त्यांची संख्या एक पासून सुरू होण्याची अपेक्षा असते, इ.

म्हणूनच Java ने सादर केले 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. वर्गात रूपांतरित करणे

प्रत्यक्षात, येथे जादूचे काहीही नाही. कंपाइलरने आम्हाला काही सिंटॅक्टिक साखर दिली. संकलित वेळी, Dayenum एका सामान्य वर्गात रूपांतरित केले जाते:

कोड, सरलीकृत आवृत्ती नोंद
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वर्ग

स्थिर स्थिरांकांची यादी enum A व्हेरिएबलच्या







सर्व मूल्यांसह एक अॅरे जे विशिष्ट ऑब्जेक्टचे मूल्य संग्रहित करते क्लास खाजगी आहे, याचा अर्थ क्लासच्या ऑब्जेक्ट्स फक्त क्लासमध्ये तयार केल्या जाऊ शकतात . ऑब्जेक्टवर पद्धत कॉल करणे आवश्यक आहे . ते ऑब्जेक्टचे मूल्य - फील्ड परत करते. पद्धत वर्गाच्या सर्व मूल्यांसह एक स्थिर अॅरे मिळवते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;

MONDAYवर्गात फक्त एक स्थिर क्षेत्र (स्थिर) आहे Day. वर्गाच्या बाहेरून स्थिर पद्धती आणि फील्डमध्ये प्रवेश करताना, तुम्ही फील्ड किंवा पद्धतीच्या नावापूर्वी वर्गाचे नाव सूचित केले पाहिजे.



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];
सोमवार
सोमवारची अनुक्रमणिका मिळवा:
सोमवार नंतर 2 दिवसांनी आठवड्याचा 0 दिवस

महत्त्वाचा मुद्दा:enum मूल्ये स्थिरांकांचा निश्चित संच असल्यामुळे , त्यांची तुलना == वापरून केली जाऊ शकते . दुसऱ्या शब्दांत, तुमच्याकडे MONDAYभिन्न पत्त्यासह दोन समान वस्तू असू शकत नाहीत. प्रत्येक enum मूल्याचे फक्त एकच उदाहरण अस्तित्त्वात आहे. आणि याचा अर्थ असा की == वापरून enum व्हेरिएबल्सची तुलना करणे नेहमी कार्य करेल.



6. तुमच्या स्वतःच्या पद्धती एक मध्ये जोडणेenum

संकलित वेळी एक सामान्य वर्गात बदलल्यामुळे enum, तुम्ही त्यात पद्धती घोषित करू शकता. या पद्धती फक्त कंपाइलरने व्युत्पन्न केलेल्या वर्गात जोडल्या जातात. उदाहरणार्थ, समजा आम्हाला Day enumअॅरेऐवजी 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.