CodeGym /جاوا بلاگ /Random-UR /جاوا میں اینوم کلاس
John Squirrels
سطح
San Francisco

جاوا میں اینوم کلاس

گروپ میں شائع ہوا۔
ہائے! اس مضمون میں ہم آپ کو 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 حقیقی دن ہوتے ہیں، اور ان میں سے ہر ایک کا ایک مخصوص نام ہوتا ہے۔ لہذا، ہمارا کام یہ ہے کہ کسی طرح DayOfWeek کلاس کے لیے ممکنہ اقدار کی حد کو محدود کریں ۔ جاوا 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 Person {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = DayOfWeek.SUNDAY;
    
           			System.out.println(sunday);
      		 }
    }

    آؤٹ پٹ:

    ہفتہ کا دن{عنوان = 'اتوار'}

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

تو جاوا اینم کیا ہے؟

آئیے اپنے DayOfWeek مثال پر نظرثانی کریں:

public enum DayOfWeek {

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

public class StudentSchedule {

   private DayOfWeek dayOfWeek;
   // ... other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

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

public class Student {

   private StudentSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {
      
       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("Hooray, you can sleep more!");
       } else {
           System.out.println("Damn, time for school again :(");
       }
   }
}
wakeUp() طریقہ میں ، ہم یہ تعین کرنے کے لیے Java Enum استعمال کرتے ہیں کہ طالب علم کو آگے کیا کرنا چاہیے۔ ہم نے DayOfWeek میں ہر فیلڈ کے بارے میں تفصیلات بھی فراہم نہیں کیں ، اور ہمیں اس کی ضرورت نہیں ہے: یہ واضح ہے کہ ہفتے کے دن کیسے کام کرتے ہیں۔ اگر ہم اسے موجودہ شکل میں استعمال کرتے ہیں، تو کوئی بھی ڈویلپر سمجھے گا کہ ہمارے کوڈ میں کیا ہو رہا ہے۔ Enum کی سہولت کی ایک اور مثال یہ ہے کہ اس کے مستقل کو سوئچ سٹیٹمنٹ کے ساتھ استعمال کیا جا سکتا ہے۔ مثال کے طور پر، آئیے ایک سخت غذا کے لیے ایک پروگرام لکھتے ہیں، جس میں پکوان دن کے حساب سے طے کیے جاتے ہیں:

public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("Sunday Dinner! You can even enjoy something a little sweet today.");
               break;
           case MONDAY:
               System.out.println("Lunch for Monday: chicken noodle soup!");
               break;
           case TUESDAY:
               System.out.println("Tuesday, today it's celery soup :(");
               break;
               //... and so on to the end
       }
   }
}
یہ جاوا 1.5 سے پہلے استعمال ہونے والے پرانے حل پر Enums کے فوائد میں سے ایک ہے — پرانے حل کو سوئچ کے ساتھ استعمال نہیں کیا جا سکتا ہے ۔ آپ کو Enum کے بارے میں اور کیا جاننے کی ضرورت ہے ؟ Enum ایک حقیقی کلاس ہے جس میں تمام امکانات موجود ہیں۔ مثال کے طور پر، اگر ہفتے کے دنوں کا موجودہ نفاذ ناکافی ہے، تو آپ 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 constants میں ٹائٹل فیلڈ، گیٹر اور اوور رائیڈ ٹو سٹرنگ طریقہ ہے۔ باقاعدہ کلاسوں کے مقابلے میں، 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 = 'ہفتہ'}]

  • 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);
    }

    آؤٹ پٹ:

    ہفتہ کا دن{عنوان = 'اتوار'}

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