JavaRush /جاوا بلاگ /Random-UR /جاوا میں اینوم: کلاس کا استعمال کیسے کریں۔

جاوا میں اینوم: کلاس کا استعمال کیسے کریں۔

گروپ میں شائع ہوا۔
ہیلو! اس مضمون میں میں آپ کو Java Enums کے بارے میں بتاؤں گا۔ تصور کریں کہ آپ کو ایک کام دیا گیا ہے: ایک ایسی کلاس بنائیں جو ہفتے کے دنوں کو نافذ کرے ۔ پہلی نظر میں، اس میں کچھ بھی پیچیدہ نہیں ہے، اور آپ کا کوڈ کچھ اس طرح نظر آئے گا:
public class DayOfWeek {

   private String title;

   public DayOfWeek(String title) {
       this.title = title;
   }

   public static void main(String[] args) {
       DayOfWeek dayOfWeek = new DayOfWeek("Saturday");
       System.out.println(dayOfWeek);
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
اور لگتا ہے کہ سب کچھ ٹھیک ہے، لیکن ایک مسئلہ ہے: آپ DayOfWeek کلاس کے کنسٹرکٹر کو کوئی بھی متن بھیج سکتے ہیں ۔ اس طرح، کوئی شخص ہفتے کا دن "مینڈک"، "کلاؤڈ" یا "azaza322" بنا سکتا ہے۔ یہ واضح طور پر وہ سلوک نہیں ہے جس کی ہم توقع کرتے ہیں، کیونکہ ہفتے کے صرف 7 حقیقی دن ہوتے ہیں، اور ان میں سے ہر ایک کا ایک نام ہوتا ہے۔ لہذا، ہمارا کام کسی نہ کسی طرح " ہفتے کے دن " کلاس کے لیے ممکنہ اقدار کی حد کو محدود کرنا ہے ۔ جاوا 1.5 سے پہلے، ڈویلپرز کو مجبور کیا جاتا تھا کہ وہ خود ہی اس مسئلے کا حل نکالیں، کیونکہ خود زبان میں کوئی تیار شدہ حل نہیں تھا۔ ان دنوں میں، اگر صورتحال کو محدود تعداد میں اقدار کی ضرورت تھی، تو انہوں نے یہ کیا:
public class DayOfWeek {

   private String title;

   private DayOfWeek(String title) {
       this.title = title;
   }

   public static DayOfWeek SUNDAY = new DayOfWeek("Sunday");
   public static DayOfWeek MONDAY = new DayOfWeek("Monday");
   public static DayOfWeek TUESDAY = new DayOfWeek("Tuesday");
   public static DayOfWeek WEDNESDAY = new DayOfWeek("Wednesday");
   public static DayOfWeek THURSDAY = new DayOfWeek("Thursday");
   public static DayOfWeek FRIDAY = new DayOfWeek("Friday");
   public static DayOfWeek SATURDAY = new DayOfWeek("Saturday");

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
آپ کو یہاں کیا توجہ دینا چاہئے:
  • پرائیویٹ کنسٹرکٹر۔ اگر کسی کنسٹرکٹر کو پرائیویٹ موڈیفائر سے نشان زد کیا جاتا ہے تو اس کنسٹرکٹر کا استعمال کرتے ہوئے کلاس کی کوئی چیز نہیں بنائی جا سکتی۔ اور چونکہ اس کلاس میں صرف ایک کنسٹرکٹر ہے، اس لیے DayOfWeek آبجیکٹ بالکل بھی نہیں بنایا جا سکتا۔

    public class Main {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = new DayOfWeek();//error!
       		}
    }
  • ایک ہی وقت میں، کلاس میں عوامی جامد اشیاء کی مطلوبہ تعداد موجود تھی جو ہماری ضرورت کے مطابق شروع کی گئی تھیں (دنوں کے نام درست ہیں)۔

    اس نے دوسری کلاسوں میں اشیاء کا استعمال ممکن بنایا۔

    public class Man {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = DayOfWeek.SUNDAY;
    
           			System.out.println(sunday);
      		 }
    }

    نتیجہ:

    ہفتہ کا دن{title='Sunday'}

اس نقطہ نظر نے بڑی حد تک ہمیں مسئلہ حل کرنے کی اجازت دی۔ ہمارے پاس ہفتے کے 7 دن تھے، اور کوئی بھی نیا نہیں بنا سکتا تھا۔ یہ حل جوشوا بلوچ نے کتاب Effective Java میں تجویز کیا تھا ۔ کتاب، ویسے، بہت عمدہ ہے اور کسی بھی جاوا ڈویلپر کے لیے ضرور پڑھنی چاہیے۔
اینوم کلاس کا استعمال کیسے کریں - 2
جاوا 1.5 کے اجراء کے ساتھ، زبان نے ایسے حالات کے لیے ایک تیار حل متعارف کرایا - Enum enumeration ۔ Enum بھی ایک کلاس ہے۔ لیکن یہ ہمارے جیسے مسائل کو حل کرنے کے لیے خاص طور پر "مطابق" ہے: قدروں کی ایک مخصوص حد کی تخلیق۔ چونکہ جاوا کے تخلیق کاروں کے پاس پہلے سے ہی تیار شدہ مثالیں تھیں (کہیں، C زبان، جس میں Enum پہلے سے موجود ہے)، وہ بہترین آپشن بنانے کے قابل تھے۔

اینوم کیا ہے؟

تو، جاوا میں Enum کیا ہے ؟ آئیے اسی DayOfWeek کی مثال دیکھیں :
public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
یہ پہلے سے زیادہ آسان نظر آتا ہے :) ہمارے Enum کے اندر جامد رسائی کے ساتھ 7 مستقل ہیں۔ ہم اسے پہلے ہی پروگرام میں منطق کو لاگو کرنے کے لیے استعمال کر سکتے ہیں۔ مثال کے طور پر، آئیے ایک پروگرام لکھتے ہیں جو اس بات کا تعین کرے گا کہ طالب علم کو آج اسکول جانے کی ضرورت ہے۔ ہمارے طالب علم کا اپنا روزانہ کا معمول ہوگا، جسے ScholarSchedule کلاس کے ذریعہ نامزد کیا گیا ہے :
public class ScholarSchedule {

   private DayOfWeek dayOfWeek;
   //...other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
دن کے موڈ میں dayOfWeek متغیر اس بات کا تعین کرتا ہے کہ یہ کون سا دن ہے۔ اور یہاں ہمارے طالب علم کی کلاس ہے:
public class Scholar {

   private ScholarSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {

       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("Hooray, you can sleep some more!");
       } else {
           System.out.println("Damn, back to school :(");
       }
   }
}
wakeUp() طریقہ میں ، Enum کا استعمال کرتے ہوئے، ہم طالب علم کے مزید اقدامات کا تعین کرتے ہیں۔ ہم نے تفصیل سے یہ بھی نہیں بتایا کہ DayOfWeek میں ہر متغیر کا کیا مطلب ہے، اور یہ ضروری نہیں ہے: ہفتے کے دنوں کا طریقہ کار پہلے سے ہی واضح ہے، اور اگر ہم اسے اس کی موجودہ شکل میں استعمال کرتے ہیں، تو کوئی بھی ڈویلپر سمجھے گا کہ کیا آپ کے کوڈ میں ہو رہا ہے۔ Enum کی سہولت کی ایک اور مثال یہ ہے کہ اس کے مستقل کو سوئچ سٹیٹمنٹ کے ساتھ استعمال کیا جا سکتا ہے ۔ مثال کے طور پر، ہم ایک سخت غذا کے لیے ایک پروگرام لکھ رہے ہیں، جس میں کھانے کا دن کے حساب سے شیڈول کیا جاتا ہے:
public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("Sunday lunch! Today you can even have a little sweet");
               break;
           case MONDAY:
               System.out.println("Monday Lunch: Chicken Noodles!");
               break;
           case TUESDAY:
               System.out.println("Tuesday, today is celery soup :(");
               break;
               //...and so on until the end
       }
   }
}
یہ پرانے حل کے مقابلے میں Enum کے فوائد میں سے ایک ہے جو Java 1.5 سے پہلے استعمال ہوتا تھا: پرانے حل کو switch کے ساتھ استعمال نہیں کیا جا سکتا تھا ۔

اینوم کلاس کے بارے میں آپ کو اور کیا جاننے کی ضرورت ہے؟

اینوم کلاس ایک حقیقی کلاس ہے جس کے ساتھ آنے والی تمام صلاحیتیں ہیں۔ مثال کے طور پر، اگر ہفتے کے دنوں کا موجودہ نفاذ آپ کے لیے کافی نہیں ہے، تو آپ DayOfWeek میں متغیرات، تعمیر کنندگان اور طریقے شامل کر سکتے ہیں:
public enum DayOfWeek {

   SUNDAY ("Sunday"),
   MONDAY ("Monday"),
   TUESDAY ("Tuesday"),
   WEDNESDAY ("Wednesday"),
   THURSDAY ("Thursday"),
   FRIDAY ("Friday"),
   SATURDAY ("Saturday");

   private String title;

   DayOfWeek(String title) {
       this.title = title;
   }

   public String getTitle() {
       return title;
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
ہمارے Enum کے مستقل میں اب ایک ٹائٹل فیلڈ ، ایک گیٹر، اور ایک اوور رائیڈ ٹو سٹرنگ طریقہ ہے ۔ باقاعدہ کلاسوں کے مقابلے میں، Enum کی ایک سنگین حد ہے - اسے وراثت میں نہیں مل سکتا۔ اس کے علاوہ، گنتی میں ان کے لیے منفرد طریقے ہیں:
  • values() : Enum میں ذخیرہ شدہ تمام اقدار کی ایک صف لوٹاتا ہے:

    public static void main(String[] args) {
       		System.out.println(Arrays.toString(DayOfWeek.values()));
    }

    نتیجہ:

    [DayOfWeek{title='Sunday'}, DayOfWeek{title='Monday'}, DayOfWeek{title='Tuesday'}, DayOfWeek{title='Wednesday'}, DayOfWeek{title='Thursday'}, DayOfWeek{title= 'جمعہ'}، ہفتہ کا دن{title='Saturday'}]

  • ordinal() : ایک مستقل کا آرڈینل نمبر لوٹاتا ہے۔ الٹی گنتی صفر سے شروع ہوتی ہے:

    public static void main(String[] args) {
    
       		int sundayIndex = DayOfWeek.SUNDAY.ordinal();
       		System.out.println(sundayIndex);
    }

    نتیجہ:

    0

  • valueOf() :دیئے گئے نام کے مطابق ایک Enum آبجیکٹ لوٹاتا ہے:

    public static void main(String[] args) {
       DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY");
       System.out.println(sunday);
    }

    نتیجہ:

    ہفتہ کا دن{title='Sunday'}

توجہ فرمایے:ہم Enum عناصر کے نام کیپٹلائز کرتے ہیں کیونکہ وہ مستقل ہیں اور انہیں مستقل کے طور پر نامزد کیا گیا ہے، CamelCase نہیں ۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION