CodeGym /جاوا بلاگ /Random-SD /اينيم. عملي مثال. ٺاهيندڙن ۽ طريقن کي شامل ڪرڻ
John Squirrels
سطح
San Francisco

اينيم. عملي مثال. ٺاهيندڙن ۽ طريقن کي شامل ڪرڻ

گروپ ۾ شايع ٿيل
سلام اڄ اسان جاوا جي خاص ڊيٽا جي قسمن مان هڪ بابت ڳالهائينداسين: 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 موسمون آهن. هڪ آڪٽو ۾ صرف 8 نوٽس آهن. ڪئلينڊر ۾ صرف 12 مهينا آهن. ۽ ڊيني Ocean of Ocean's 11 وٽ صرف 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("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);
   }

}
پر، جاوا ڊولپرز موجوده مسئلي ڏانهن ڌيان ڏنو. يقينن، اها وڏي ڳالهه آهي ته پروگرامر ٻوليءَ ۾ موجود اوزارن کي استعمال ڪندي هڪ حل کڻي آيا هئا، پر اهو بلڪل آسان نه ٿو لڳي! هڪ واضح حل جي ضرورت هئي، جيتوڻيڪ novices لاء. ۽ ائين ئي Enumجاوا ۾ ظاهر ٿيو. بنيادي طور تي، Enumهڪ جاوا طبقو آهي جيڪو مهيا ڪري ٿو محدود سيٽ اعتراض جي قدر. هتي اهو ڪيئن ڏسڻ ۾ اچي ٿو:
public enum Month {

   JANUARY,
   FEBRUARY,
   MARCH
}
تعريف ۾، اسان اشارو ڪيو ته Enumهڪ جاوا ڪلاس آهي، پر ڇا اهو واقعي سچ آهي؟ ها، ۽ اسان به ان جي تصديق ڪري سگهون ٿا. مثال طور، ڪوشش ڪريو اسان جي Monthاينم کي ورثي ۾ ڪجهه ٻيو طبقو:
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
جئين توهان اڳ ۾ ئي ڄاڻو ٿا، جاوا ڪيترن ئي ورثي جي حمايت نٿو ڪري. تنهن ڪري، اسان وارث نٿا ڪري سگهون AbstractMonth. هن نئين تعمير کي ڪيئن Enumاستعمال ڪري سگهجي ٿو؟ ۽ اهو ڪيئن مختلف آهي فيلڊ سان پراڻي تعمير کان static final؟ خير، مثال طور، پراڻي تعمير اسان کي switchبيانن ۾ اسان جي پنهنجي قدرن جو سيٽ استعمال ڪرڻ نه ڏنو. تصور ڪريو ته اسان هڪ پروگرام ٺاهڻ چاهيون ٿا جيڪو اسان کي هر مهيني ملهايل موڪلن جي ياد ڏياريندو:
public class HolidayReminder {

   public void printHolidays(Month month) {

       switch (month) {

           // Error!
           case JANUARY:
       }
   }
}
جئين توهان ڏسي سگهو ٿا، مرتب ڪندڙ هتي هڪ غلطي اڇلائي ٿو. پر هڪ دفعو enumجاوا 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اسان کي مهينن تائين رسائي حاصل ڪرڻ لاء اعتراض پيدا ڪرڻ جي ضرورت ناهي . جڏهن اينيمڪس سان ڪم ڪندي، اهو تمام ضروري آهي ته اهو نه وساريو ته اهو Enumهڪ مڪمل طبقو آهي. ان جو مطلب اهو آهي ته، جيڪڏهن ضروري هجي ته، توهان ان ۾ تعمير ڪندڙ ۽ طريقا بيان ڪري سگهو ٿا. مثال طور، پوئين ڪوڊ جي ٽڪري ۾، اسان صرف قدر بيان ڪيو: JANUARY, FEBRUARY, MARCH. تنهن هوندي، اسان 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}]
آخرڪار، مان هڪ انتهائي مفيد جاوا ڪتاب جي سفارش ڪرڻ چاهيان ٿو، يعني جوشوا بلوچ پاران "مؤثر جاوا" . اينيم.  عملي مثال.  تعمير ڪندڙ ۽ طريقا شامل ڪرڻ - 3ليکڪ جاوا جي تخليقڪارن مان هڪ آهي، تنهنڪري توهان ضرور هن جي صلاح تي اعتبار ڪري سگهو ٿا ته ڪيئن صحيح ۽ قابليت سان ٻولي جا اوزار استعمال ڪيا وڃن :) اسان جي سبق جي حوالي سان، مان توهان کي صلاح ڏيان ٿو ته توهان ڪتاب جي باب تي خاص ڌيان ڏيو Enum. خوش پڙهڻ! :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION