JavaRush /جاوا بلاگ /Random-SD /Enum جاوا ۾. عملي مثال. جوڙيندڙن ۽ طريقن کي شامل ڪرڻ

Enum جاوا ۾. عملي مثال. جوڙيندڙن ۽ طريقن کي شامل ڪرڻ

گروپ ۾ شايع ٿيل
سلام! اڄ اسان جاوا ۾ هڪ خاص ڊيٽا جي قسم بابت ڳالهائينداسين - Enum(شمار ​​ڪرڻ لاء مختصر). انهن جي خاصيت ڇا آهي؟ اچو ته تصور ڪريو ته اسان کي پروگرام ۾ مهينن تي عمل ڪرڻ جي ضرورت آهي. اينيم.  عملي مثال.  تعمير ڪندڙ ۽ طريقا شامل ڪرڻ - 1لڳي ٿو، مسئلو ڇا آهي؟ توهان کي صرف اهو طئي ڪرڻ جي ضرورت آهي ته ڪنهن به مهيني ۾ ڪهڙا خاصيتون آهن. شايد اسان کي ضرورت آهي، سڀ کان پهريان، مهيني جو نالو ۽ ان ۾ ڏينهن جو تعداد. مسئلي جو حل بلڪل سادو نظر اچي ٿو:
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 موسمون آهن. موسيقي ۾ صرف 7 نوٽس آهن. ڪئلينڊر ۾ صرف 12 مهينا آهن. Ocean وٽ صرف 11 دوست آهن (جيتوڻيڪ اهو قابل بحث آهي :)) ٻين لفظن ۾، هڪ باقاعده جاوا ڪلاس انهن ادارن کي ماڊل ڪرڻ ۽ انهن جي قدرتي رڪاوٽن جو احترام ڪرڻ جي قابل ناهي. اسان جي ڪلاس Month۾ سڀ ضروري شعبا آهن. پر جيڪڏهن ڪو ٻيو پروگرامر ان کي استعمال ڪري ٿو، ڪو به کيس مڪمل طور تي چريو شيون ٺاهڻ کان روڪي نه سگهندو:
public class Main {

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

}
جيڪڏهن اهو پروگرام ۾ ظاهر ٿئي ٿو، اهو مجرم ڳولڻ آسان نه هوندو! هڪ طرف، پروگرامر جيڪو شيون ٺاهي سگهي ٿو سمجهي سگهي ٿو ته ڪلاس جو Monthمطلب آهي "سال جو مهينو" ۽ اهڙي بيڪار لکڻ نه. ٻئي طرف، هو صرف انهن موقعن جو فائدو وٺي رهيو هو جيڪي ڪلاس ڊزائينر هن کي فراهم ڪيا آهن. ڇا مان ڪنهن جا نالا ۽ ڏينهن جو تعداد تفويض ڪري سگهان ٿو؟ هن ان کي مقرر ڪيو. اهڙي صورتحال ۾ ڇا ڪجي؟ جاوا ٻولي ورزن 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("Январь", 31);
   public static Month FEBRUARY = new Month("Февраль", 28);
   public static Month MARCH = new Month("Март", 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اهو هڪ جاوا طبقو آهي جيڪو قيمتي شين جو هڪ محدود سيٽ مهيا ڪري ٿو. ھتي آھي اھو ڇا ڏسڻ ۾ اچي ٿو:
public enum Month {

   JANUARY,
   FEBRUARY,
   MARCH
}
تعريف ۾، اسان اشارو ڪيو ته Enumاهو هڪ جاوا طبقو آهي، پر ڇا اهو واقعي سچ آهي؟ ها، ۽ اسان ان کي به چيڪ ڪري سگهون ٿا. ڪوشش ڪريو، مثال طور، اسان کي enum Monthڪنهن ٻئي طبقي مان ورثي ۾ آڻڻ:
public abstract class AbstractMonth {
}

//ошибка! No extends clause allowed to enum
public enum Month extends AbstractMonth {

   JANUARY,
   FEBRUARY,
   MARCH
}
ائين ڇو ٿي رهيو آهي؟ جڏهن اسان هڪ پروگرام ڏانهن لکندا آهيون:
public enum Month
مرتب ڪندڙ هن حڪم کي هن طرح ڪوڊ ۾ تبديل ڪري ٿو:
public Class Month extends Enum
جئين توهان اڳ ۾ ئي ڄاڻو ٿا، جاوا ۾ گهڻن ورثي جي اجازت ناهي. تنهن ڪري، AbstractMonthاسان کان وارث نه ٿي سگهيا آهيون. هن نئين ڊيزائن کي ڪيئن Enumاستعمال ڪري سگهجي ٿو؟ ۽ اهو ڪيئن مختلف آهي پراڻي ڊيزائن سان static finalفيلڊ سان؟ خير، مثال طور، پراڻي ڊيزائن اسان کي استعمال ڪرڻ جي اجازت نه ڏني هئي اسان جي پنهنجي قيمتن جي سيٽ ۾ switch-expressions. تصور ڪريو ته اسان هڪ پروگرام ٺاهڻ چاهيون ٿا جيڪو اسان کي ياد ڏياريندو ته هن مهيني ڪهڙيون موڪلون ملهايون وينديون آهن:
public class HolidayReminder {

   public void printHolidays(Month month) {

       switch (month) {

           //error!
           case JANUARY:
       }
   }
}
هتي، جيئن توهان ڏسي سگهو ٿا، مرتب ڪندڙ هڪ غلطي اڇلائي ٿو. پر جاوا 1.5 کان پوء ظاهر ٿيو enum، هر شيء بلڪل آسان ٿي وئي:
public enum Month {

   JANUARY,
   FEBRUARY,
   MARCH
}

public class HolidayReminder {

   public void printHolidays(Month month) {

       switch (month) {

           case JANUARY:
               System.out.println("7 января будет Рождество!");
               break;
           case FEBRUARY:
               System.out.println("В феврале празднуется День Защитника Отечества - 23 февраля!");
               break;
           case MARCH:
               System.out.println("В марте отмечается Всемирный Женский День - 8 марта!");
               break;
       }
   }
}



public class Main {

   public static void main(String[] args) {

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

   }

}
ڪنسول آئوٽ:

7 января будет Рождество!
مهرباني ڪري نوٽ ڪريو: شين تائين رسائي Enumجامد رهي ٿي، جيئن جاوا 1.5 کان اڳ هئي. مھينن تائين پھچڻ لاءِ اسان کي ڪا شئي ٺاھڻ جي ضرورت ناھي Month. جڏهن ڳڻپ سان ڪم ڪندي، اهو تمام ضروري آهي ته اهو نه وسارڻ گهرجي ته Enumهي هڪ مڪمل طبقو آهي. ان جو مطلب اهو آهي ته، جيڪڏهن ضروري هجي ته، توهان ان ۾ تعمير ڪندڙ ۽ طريقا بيان ڪري سگهو ٿا. مثال طور، ڪوڊ جي پوئين حصي ۾ اسان صرف قدر بيان ڪيو آهي JANUARY, FEBRUARY, MARCH. تنهن هوندي، اسان اسان کي enum Monthهن طرح وڌائي سگهون ٿا:
public enum Month {

   JANUARY("Январь", 31),
   FEBRUARY("Февраль", 28),
   MARCH("Март", 31),
   APRIL("Апрель", 30),
   MAY("Май", 31),
   JUNE("Июнь", 30),
   JULY("Июль", 31),
   AUGUST("Август", 31),
   SEPTEMBER("Сентябрь", 30),
   OCTOBER("Октябрь", 31),
   NOVEMBER("Ноябрь", 30),
   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 +
               '}';
   }
}
هتي اسان 2 فيلڊ شامل ڪيا آهن اسان جي enum- مهيني جو نالو ۽ ڏينهن جو تعداد، هڪ تعمير ڪندڙ انهن شعبن کي استعمال ڪندي، حاصل ڪندڙ-سيٽر، هڪ طريقو 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='Июнь', daysCount=30}, Month{name='Июль', daysCount=31}, Month{name='Август', daysCount=31}]
آخرڪار، مان توهان کي جاوا تي هڪ انتهائي مفيد ڪتاب جي سفارش ڪرڻ چاهيان ٿو، يعني جوشوا بلوچ پاران "مؤثر جاوا" . اينيم.  عملي مثال.  تعمير ڪندڙ ۽ طريقا شامل ڪرڻ - 3ليکڪ جاوا جي تخليق ڪندڙن مان هڪ آهي، تنهنڪري توهان ضرور ٻوليء جي اوزار جي صحيح ۽ قابل استعمال تي هن جي صلاح تي اعتماد ڪري سگهو ٿا :) اسان جي ليڪچر جي سلسلي ۾، مان توهان کي صلاح ڏيان ٿو ته ڪتاب جي باب تي خاص ڌيان ڏيو enum. هڪ پيداواري پڙهڻ آهي! :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION