CodeGym /جاوا بلاگ /Random-UR /اینوم عملی مثالیں۔ کنسٹرکٹرز اور طریقے شامل کرنا
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 مہینے ہیں۔ اور ڈینی اوشین آف اوشینز 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);
   }

}
لیکن، جاوا ڈویلپرز نے موجودہ مسئلے کی طرف توجہ مبذول کرائی۔ یقینا، یہ بہت اچھا ہے کہ پروگرامرز زبان میں دستیاب ٹولز کا استعمال کرتے ہوئے حل نکالنے میں کامیاب ہوئے، لیکن یہ بہت آسان نہیں لگتا! ایک واضح حل کی ضرورت تھی، یہاں تک کہ نوخیزوں کے لیے بھی۔ اور اسی طرح Enumجاوا میں ظاہر ہوا۔ بنیادی طور پر، Enumایک جاوا کلاس ہے جو آبجیکٹ ویلیوز کا ایک محدود سیٹ فراہم کرتی ہے۔ یہاں یہ کیسا لگتا ہے:
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
جیسا کہ آپ پہلے ہی جانتے ہیں، جاوا متعدد وراثت کی حمایت نہیں کرتا ہے۔ اس لیے ہم وارث نہیں ہو سکتے 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ہمیں مہینوں تک رسائی کے لیے کوئی چیز بنانے کی ضرورت نہیں ہے ۔ enums کے ساتھ کام کرتے وقت، یہ بہت اہم ہے کہ یہ نہ بھولیں کہ یہ Enumایک مکمل کلاس ہے۔ اس کا مطلب یہ ہے کہ، اگر ضروری ہو تو، آپ اس میں کنسٹرکٹرز اور طریقوں کی وضاحت کر سکتے ہیں۔ مثال کے طور پر، پچھلے کوڈ کے ٹکڑے میں، ہم نے صرف اقدار کی وضاحت کی ہے: جنوری، فروری، مارچ۔ تاہم، ہم اپنے 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}]
آخر میں، میں جاوا کی ایک انتہائی مفید کتاب کی سفارش کرنا چاہتا ہوں، یعنی "Effective Java" by Joshua Bloch ۔ اینوم  عملی مثالیں۔  تعمیر کنندگان اور طریقے شامل کرنا - 3مصنف جاوا کے تخلیق کاروں میں سے ایک ہے، اس لیے آپ یقینی طور پر اس کے مشورے پر بھروسہ کر سکتے ہیں کہ زبان کے آلات کو صحیح اور قابلیت سے کیسے استعمال کیا جائے :) ہمارے سبق کے حوالے سے، میں تجویز کرتا ہوں کہ آپ کتاب کے باب پر خصوصی توجہ دیں Enum۔ خوش پڑھنا! :)
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION