CodeGym /Java Blog /यादृच्छिक /एनम. व्यावहारिक उदाहरणे. कन्स्ट्रक्टर आणि पद्धती जोडत आहे...
John Squirrels
पातळी 41
San Francisco

एनम. व्यावहारिक उदाहरणे. कन्स्ट्रक्टर आणि पद्धती जोडत आहे

यादृच्छिक या ग्रुपमध्ये प्रकाशित केले
हाय! आज आपण जावाच्या एका विशेष डेटा प्रकाराबद्दल बोलू: Enum("गणना" साठी लहान). काय ते विशेष बनवते? प्रोग्राममध्ये "महिने" लागू करण्यासाठी आपल्याला काय आवश्यक आहे याची कल्पना करूया. एनम.  व्यावहारिक उदाहरणे.  कन्स्ट्रक्टर आणि पद्धती जोडणे - १ समस्याप्रधान वाटत नाही, बरोबर? आम्हाला फक्त कोणत्याही महिन्यात कोणते गुणधर्म आहेत हे निर्धारित करणे आवश्यक आहे. कदाचित आपल्याला प्रथम महिन्याचे नाव आणि त्यातील दिवसांची संख्या आवश्यक आहे. उपाय अगदी सोपे दिसते:

public class Month {

   private String name;
   private int daysCount;

   public Month(String name, int daysCount) {
       this.name = name;
       this.daysCount = daysCount;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public int getDaysCount() {
       return daysCount;
   }

   public void setDaysCount(int daysCount) {
       this.daysCount = daysCount;
   }

   @Override
   public String toString() {
       return "Month{" +
               "name='" + name + '\'' +
               ", daysCount=" + daysCount +
               '}';
   }
}
संपूर्ण शबांग! आमच्याकडे Monthवर्ग आहे, आवश्यक फील्ड, गेटर/सेटर्स आणि toString(). जोपर्यंत, नक्कीच, आम्हाला जोडणे आवश्यक आहे equals()आणिhashCode()पूर्ण आनंद मिळवण्यासाठी :) पण इथे एक वैचारिक समस्या आहे. तुम्हाला कदाचित आठवत असेल, OOP चा एक मुख्य फायदा असा आहे की ते वास्तविक जगातून घटकांचे मॉडेल बनवणे सोपे करते. एक खुर्ची, एक कार, एक ग्रह - या सर्व सामान्य जीवनातील संकल्पना अमूर्ततेच्या मदतीने प्रोग्राममध्ये सहजपणे दर्शविल्या जातात. समस्या अशी आहे की काही वास्तविक-जगातील घटकांमध्ये मूल्यांची काटेकोरपणे मर्यादित श्रेणी असते. वर्षात फक्त 4 ऋतू असतात. एका सप्तकात फक्त 8 नोटा असतात. कॅलेंडरमध्ये फक्त 12 महिने आहेत. आणि Ocean's 11 च्या डॅनी ओशनचे फक्त 11 मित्र आहेत (जरी याने काही फरक पडत नाही :)) काय फरक पडतो की एक सामान्य Java वर्ग या घटकांचे मॉडेल बनवू शकत नाही आणि त्यांच्या नैसर्गिक मर्यादा लागू करू शकत नाही. आमचेMonthवर्गात सर्व आवश्यक फील्ड आहेत. परंतु जर दुसरा प्रोग्रामर वापरत असेल तर त्याला किंवा तिला पूर्णपणे वेड्या वस्तू तयार करण्यापासून कोणीही रोखू शकत नाही:

public class Main {

   Month month1 = new Month("lolkek", 322);
   Month month2 = new Month("yahoooooooooooo", 12345);

}
आमच्या कोडमध्ये हे दिसल्यास, गुन्हेगार शोधणे सोपे होणार नाही! एकीकडे, ऑब्जेक्ट्स तयार करणार्‍या प्रोग्रामरला हे समजू शकते की Monthक्लास म्हणजे "वर्षातील महिना" आणि असा मूर्खपणा लिहू नये. दुसरीकडे, प्रोग्रामर केवळ क्लास डिझायनरने प्रदान केलेल्या क्षमतांचा फायदा घेत आहे. अनियंत्रित नावे आणि दिवसांची संख्या नियुक्त करणे शक्य आहे का? नेमके तेच मिळाले. मग या परिस्थितीत आपण काय करावे? प्रामाणिकपणे, Java 1.5 रिलीझ होण्यापूर्वी, प्रोग्रामरना क्रिएटिव्ह व्हायला हवे होते :) त्या दिवसांत, त्यांनी यासारख्या रचना तयार केल्या:

public class Month {

   private String name;
   private int daysCount;

   private Month(String name, int daysCount) {
       this.name = name;
       this.daysCount = daysCount;
   }

   public static Month JANUARY = new Month("January", 31);
   public static Month FEBRUARY = new Month("February", 28);
   public static Month MARCH = new Month("March", 31);

   @Override
   public String toString() {
       return "Month{" +
               "name='" + name + '\'' +
               ", daysCount=" + daysCount +
               '}';
   }
}
उदाहरण लहान करण्यासाठी येथे आम्ही महिन्यांची संख्या बारा वरून तीन केली आहे. अशा डिझाईन्समुळे समस्येचे निराकरण करणे शक्य झाले. ऑब्जेक्ट्स तयार करण्याची क्षमता खाजगी कन्स्ट्रक्टरपुरती मर्यादित होती:

private Month(String name, int daysCount) {
       this.name = name;
       this.daysCount = daysCount;
   }
वर्ग वापरणारे प्रोग्रामर फक्त Monthऑब्जेक्ट्स तयार करू शकत नाहीत. त्यांना क्लास डेव्हलपरने प्रदान केलेल्या अंतिम स्थिर वस्तू वापरायच्या होत्या. उदाहरणार्थ, यासारखे:

public class Main {

   public static void main(String[] args) {

       Month january = Month.JANUARY;
       System.out.println(january);
   }

}
परंतु, जावा विकसकांनी विद्यमान समस्येकडे लक्ष वेधले. अर्थात, हे छान आहे की प्रोग्रामर भाषेत उपलब्ध साधनांचा वापर करून उपाय शोधण्यात सक्षम होते, परंतु ते फार सोपे दिसत नाही! अगदी नवशिक्यांसाठीही एक स्पष्ट उपाय आवश्यक होता. आणि म्हणून Enumजावा मध्ये दिसू लागले. मूलभूतपणे, Enumएक Java वर्ग आहे जो ऑब्जेक्ट मूल्यांचा मर्यादित संच प्रदान करतो. ते कसे दिसते ते येथे आहे:

public enum Month {
  
   JANUARY,
   FEBRUARY,
   MARCH
}
व्याख्येमध्ये, आम्ही सूचित केले आहे की Enumजावा वर्ग आहे, परंतु ते खरोखर खरे आहे का? होय, आणि आम्ही ते सत्यापित देखील करू शकतो. उदाहरणार्थ, आमचा Monthenum इतर वर्गाचा वारसा बनवण्याचा प्रयत्न करा:

public abstract class AbstractMonth {
}

// Error! The extends clause cannot be used with an enum
public enum Month extends AbstractMonth {

   JANUARY,
   FEBRUARY,
   MARCH
}
असे का होते? जेव्हा आम्ही लिहितो:

public enum Month
कंपाइलर हे विधान खालील कोडमध्ये रूपांतरित करतो:

public Class Month extends Enum
तुम्हाला आधीच माहिती आहे, Java एकाधिक वारसा समर्थन देत नाही. म्हणून, आम्ही वारसा घेऊ शकत नाही AbstractMonth. हे नवीन बांधकाम कसे Enumवापरले जाऊ शकते? आणि हे फील्डसह जुन्या बांधकामापेक्षा वेगळे कसे आहे static final? बरं, उदाहरण म्हणून, जुन्या रचना आम्हाला विधानांमध्ये आमच्या स्वतःच्या मूल्यांचा संच वापरू देत नाही switch. अशी कल्पना करा की आम्हाला एक कार्यक्रम तयार करायचा आहे जो आम्हाला प्रत्येक महिन्यात साजऱ्या होणाऱ्या सुट्ट्यांची आठवण करून देईल:

public class HolidayReminder {

   public void printHolidays(Month month) {

       switch (month) {

           // Error!
           case JANUARY:
       }
   }
}
तुम्ही बघू शकता, कंपाइलर येथे एक त्रुटी टाकतो. परंतु एकदा enumJava 1.5 मध्ये दिसू लागल्यावर, सर्वकाही खूप सोपे झाले:

public enum Month {

   JANUARY,
   FEBRUARY,
   MARCH
}

public class HolidayReminder {

   public void printHolidays(Month month) {

       switch (month) {
          
           case JANUARY:
               System.out.println("New Year's Day is January 1st!");
               break;
           case FEBRUARY:
               System.out.println("Valentine's Day is February 14th!");
               break;
           case MARCH:
               System.out.println("Saint Patrick's Day is March 17th!");
               break;
       }
   }
}


public class Main {

   public static void main(String[] args) {

       HolidayReminder reminder = new HolidayReminder();
       reminder.printHolidays(Month.JANUARY);

   }

}
कन्सोल आउटपुट:

New Year's Day is January 1st!
लक्षात घ्या की Enumवस्तूंचा प्रवेश जावा 1.5 पूर्वी होता तसाच स्थिर राहिला. Monthआम्हाला महिन्यांमध्ये प्रवेश करण्यासाठी एखादी वस्तू तयार करण्याची आवश्यकता नाही . Enumenums सह काम करताना, तो एक पूर्ण वाढ झालेला वर्ग आहे हे विसरू नका खूप महत्वाचे आहे . याचा अर्थ असा की, आवश्यक असल्यास, आपण त्यात कन्स्ट्रक्टर आणि पद्धती परिभाषित करू शकता. उदाहरणार्थ, मागील कोडच्या तुकड्यात, आम्ही फक्त मूल्ये निर्दिष्ट केली आहेत: जानेवारी, फेब्रुवारी, मार्च. Monthतथापि, आम्ही आमचा एनम याप्रमाणे वाढवू शकतो :

public enum Month {

   JANUARY("January", 31),
   FEBRUARY("February", 28),
   MARCH("March", 31),
   APRIL("April", 30),
   MAY("May", 31),
   JUNE("June", 30),
   JULY("July", 31),
   AUGUST("August", 31),
   SEPTEMBER("September", 30),
   OCTOBER("October", 31),
   NOVEMBER("November", 30),
   DECEMBER("December", 31);

   private String name;
   private int daysCount;

   Month(String name, int daysCount) {
       this.name = name;
       this.daysCount = daysCount;
   }

   public static Month[] getWinterMonths() {

       return new Month[]{DECEMBER, JANUARY, FEBRUARY};
   }

   public static Month[] getSummerMonths() {

       return new Month[]{JUNE, JULY, AUGUST};
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public int getDaysCount() {
       return daysCount;
   }

   public void setDaysCount(int daysCount) {
       this.daysCount = daysCount;
   }

   @Override
   public String toString() {
       return "Month{" +
               "name='" + name + '\'' +
               ", daysCount=" + daysCount +
               '}';
   }
}
येथे आम्ही आमच्या enum2 फील्ड (महिन्याचे नाव आणि दिवसांची संख्या), एक कन्स्ट्रक्टर जे या फील्ड्स, गेटर/सेटर्स, पद्धत toString()आणि 2 स्टॅटिक पद्धती वापरतात. जसे आपण पाहू शकता, यात कोणतीही समस्या नव्हती. पुन्हा, Enumखरोखर एक पूर्ण वाढ झालेला वर्ग आहे:

import java.util.Arrays;

public class Main {

   public static void main(String[] args) {

       System.out.println(Arrays.toString(Month.getSummerMonths()));

   }

}
कन्सोल आउटपुट:

[Month{name='June', daysCount=30}, Month{name='July', daysCount=31}, Month{name='August', daysCount=31}]
शेवटी, मला अत्यंत उपयुक्त जावा पुस्तकाची शिफारस करायची आहे, म्हणजे जोशुआ ब्लॉचचे "प्रभावी Java" . एनम.  व्यावहारिक उदाहरणे.  कन्स्ट्रक्टर आणि पद्धती जोडणे - 3लेखक जावाच्या निर्मात्यांपैकी एक आहे, त्यामुळे भाषेची साधने योग्य आणि सक्षमपणे कशी वापरायची यावरील त्याच्या सल्ल्यावर तुम्ही निश्चितपणे विश्वास ठेवू शकता :) आमच्या धड्याच्या संदर्भात, मी शिफारस करतो की तुम्ही पुस्तकाच्या वरील अध्यायाकडे विशेष लक्ष द्या Enum. आनंदी वाचन! :)
टिप्पण्या
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION