JavaRush /جاوا بلاگ /Random-UR /جاوا میں شماریات (java enum)
articles
سطح

جاوا میں شماریات (java enum)

گروپ میں شائع ہوا۔
پروگرامنگ کرتے وقت، ہمیں اکثر ڈیٹا کی مخصوص قسم کے لیے درست اقدار کے سیٹ کو محدود کرنے کی ضرورت کا سامنا کرنا پڑتا ہے۔ لہذا، مثال کے طور پر، ہفتے کے دن کی 7 مختلف اقدار ہو سکتی ہیں، سال کے مہینے میں 12 ہو سکتے ہیں، اور سیزن میں 4 ہو سکتے ہیں۔ اس طرح کے مسائل کو حل کرنے کے لیے، بہت سی statically ٹائپ شدہ پروگرامنگ زبانیں ایک خاص ڈیٹا ٹائپ فراہم کرتی ہیں۔ گنتی ( enum) جاوا میں ابھی گنتی ظاہر نہیں ہوئی۔ enumورژن 1.5 سے شروع ہونے والی ایک خصوصی زبان کی تعمیر کو متعارف کرایا گیا تھا۔ اس وقت تک، پروگرامرز نے گنتی کو لاگو کرنے کے لیے دوسرے طریقے استعمال کیے ہیں۔ جاوا میں شماریات (java enum) - 1

enum کی تعمیر

آئیے ایک مثال سے شروع کرتے ہیں۔ آئیے enumاستعمال کرتے ہوئے سیزن کو ذخیرہ کرنے کے لیے ڈیٹا کی قسم کی وضاحت کرتے ہیں:
enum Season { WINTER, SPRING, SUMMER, AUTUMN }
ٹھیک ہے، اس کے استعمال کی ایک سادہ مثال:
Season season = Season.SPRING;
if (season == Season.SPRING) season = Season.SUMMER;
System.out.println(season);
جس کے نتیجے میں سمر کنسول پر پرنٹ ہو جائے گا ۔ میرا خیال ہے کہ مثال واضح ہے اور اس کی وضاحت کی ضرورت نہیں ہے۔

اینوم ایک کلاس ہے۔

اعلان کرکے enum، ہم واضح طور پر ایک کلاس بناتے ہیں جس سے ماخوذ ہے java.lang.Enum۔ روایتی طور پر، تعمیر enum Season { ... }کے برابر ہے class Season extends java.lang.Enum { ... }. اور اگرچہ مرتب کرنے والا ہمیں واضح طور پر ہم سے وراثت میں آنے کی اجازت نہیں دیتا ہے java.lang.Enum، پھر بھی اس بات کی تصدیق کرنا آسان ہے کہ enumیہ استعمال کرکے وراثت میں ملا ہے reflection۔
System.out.println(Season.class.getSuperclass());
مندرجہ ذیل کنسول پر دکھایا جائے گا:
class java.lang.Enum
اصل وراثت خود بخود ہمارے لیے جاوا کمپائلر کے ذریعے انجام پاتی ہے۔ اس کے بعد، آئیے کمپائلر کی طرف سے بنائی گئی کلاس کو شمار کرنے کے لیے -class enum، اور شمار شدہ قسم کی ممکنہ قدروں کو enum-a عناصر کے طور پر کال کرنے پر اتفاق کرتے ہیں۔

اینوم ممبران enumایک کلاس کی مثالیں ہیں جو مستحکم طور پر قابل رسائی ہیں۔

عناصر -کلاس کی enum Season (WINTER, SPRING и т.д.)جامد طور پر قابل رسائی مثالیں ہیں ۔ ان کی جامد دستیابی ہمیں حوالہ موازنہ آپریٹر کا استعمال کرتے ہوئے موازنہ کرنے کی اجازت دیتی ہے ۔ مثال: enumSeason==
Season season = Season.SUMMER;
if (season == Season.AUTUMN) season = Season.WINTER;

اینوم عنصر کا نام اور سیریل نمبر

جیسا کہ پہلے ذکر کیا گیا ہے، کوئی بھی enum-کلاس وراثت میں آتا ہے java.lang.Enum، جس میں تمام گنتی کے لیے مفید متعدد طریقے ہوتے ہیں۔ مثال:
Season season = Season.WINTER;
System.out.println("season.name()=" + season.name() + " season.toString()=" + season.toString() + " season.ordinal()=" + season.ordinal());
آؤٹ پٹ ہو گا:
season.name()=WINTER season.toString()=WINTER season.ordinal()=0
طریقے name()، toString()اور یہاں دکھائے گئے ہیں ordinal()۔ طریقوں کی سیمنٹکس واضح ہے۔ واضح رہے کہ یہ طریقے enumکلاس سے وراثت میں ملے ہیں java.lang.Enum۔ کسی عنصر کو enumاس کے نام کی سٹرنگ کی نمائندگی کے ذریعے حاصل کرنا اکثر کام یہ ہوتا ہے کہ کسی عنصر کو enumاس کے سٹرنگ کی نمائندگی سے حاصل کیا جائے۔ ان مقاصد کے لیے، ہر enumایک کلاس میں، مرتب کرنے والا خود بخود ایک خاص جامد طریقہ بناتا ہے:، public static EnumClass valueOf(String name)جو ایک شماری عنصر کو EnumClassایک نام کے ساتھ لوٹاتا ہے name۔ استعمال کی مثال:
String name = "WINTER";
Season season = Season.valueOf(name);
کوڈ پر عمل درآمد کے نتیجے میں، سیزن متغیر برابر ہو جائے گا Season.WINTER۔ براہ کرم نوٹ کریں کہ اگر عنصر نہیں ملتا ہے تو، ایک IllegalArgumentException پھینک دیا جائے گا ، اور اگر یہ nameبرابر ہے nullتو، ایک NullPointerException پھینک دیا جائے گا ۔ ویسے، یہ اکثر بھول جاتا ہے. کسی وجہ سے، بہت سے لوگ اس بات پر پختہ یقین رکھتے ہیں کہ اگر کوئی فنکشن ایک دلیل لیتا ہے اور کچھ شرائط کے تحت ایک IllegalArgumentException پھینکتا ہے ، تو اسے وہاں سے گزرتے وقت ، ایک IllegalArgumentExceptionnull یقینی طور پر پھینک دیا جائے گا ۔ لیکن یہ نقطہ کے سوا ہے. آئیے جاری رکھیں۔ شمار کے تمام عناصر کو حاصل کرنا بعض اوقات آپ کو رن ٹائم میں کلاس کے تمام عناصر کی فہرست حاصل کرنے کی ضرورت ہوتی ہے ۔ ان مقاصد کے لیے، مرتب کرنے والا ہر ایک کلاس میں ایک طریقہ تیار کرتا ہے ۔ استعمال کی مثال: enumenumpublic static EnumClass[] values()
System.out.println(Arrays.toString(Season.values()));
ہمیں درج ذیل آؤٹ پٹ ملتا ہے:
[WINTER, SPRING, SUMMER, AUTUMN]
نوٹ کریں کہ کلاس میں نہ تو طریقہ valueOf()اور نہ ہی طریقہ کی تعریف کی گئی ہے ۔ اس کے بجائے، وہ خود بخود مرتب کرنے والے کے ذریعہ شامل ہوجاتے ہیں جب -class مرتب کیا جاتا ہے۔ -کلاس میں اپنے طریقے شامل کرنا آپ کے پاس اپنے طریقوں کو -کلاس اور اس کے عناصر دونوں میں شامل کرنے کا موقع ہے : ایک ہی، لیکن کثیر المثالیت کے ساتھ: آخری مثال میں وراثت کے استعمال کو ظاہر کرتی ہے ۔ اس پر مزید بعد میں۔ جاوا میں وراثت آپ کو طبقاتی درجہ بندی کو نافذ کرنے کی اجازت دیتا ہے، جس کی اشیاء ایک ہی مثال میں بنائی جاتی ہیں اور مستحکم طور پر قابل رسائی ہوتی ہیں۔ اس صورت میں، عناصر اپنے کنسٹرکٹرز پر مشتمل ہو سکتے ہیں۔ آئیے ایک مثال دیتے ہیں: یہاں ہم تین عناصر کے ساتھ ایک شمار کا اعلان کرتے ہیں ، اور . مرتب کرنے والا درج ذیل کلاسز اور اشیاء بنائے گا: values()java.lang.Enumenumenumenumجاوا میں شماریات (java enum) - 2جاوا میں شماریات (java enum) - 3enumenumenumenumجاوا میں شماریات (java enum) - 4TypeINTINTEGERSTRING
  • Type--.کلاس سے ماخوذ ۔java.lang.Enum
  • INT— پہلی کلاس کا اعتراض جس سے اخذ کیا گیا ہے۔Type
  • INTEGER— 2nd کلاس کا اعتراض جس سے اخذ کیا گیا ہے۔Type
  • STRING3rd کلاس کا اعتراض جس سے اخذ کیا گیا ہے۔Type
پولیمورفک طریقہ Object parse(String)اور کنسٹرکٹر کے ساتھ تین ماخوذ کلاسز بنائے جائیں گے Type(..., boolean)۔ ایک ہی وقت میں، کلاسز کی اشیاء INT، INTEGERاور STRINGایک ہی کاپی میں موجود ہیں اور جامد طور پر قابل رسائی ہیں۔ آپ اس کی تصدیق کر سکتے ہیں:
System.out.println(Type.class);
System.out.println(Type.INT.getClass() + " " + Type.INT.getClass().getSuperclass());
System.out.println(Type.INTEGER.getClass() + " " + Type.INTEGER.getClass().getSuperclass());
System.out.println(Type.STRING.getClass()  + " " + Type.STRING.getClass().getSuperclass());
ہمیں درج ذیل آؤٹ پٹ ملتا ہے:
class Type
class Type$1 class Type
class Type$2 class Type
class Type$3 class Type
یہ دیکھا جا سکتا ہے کہ مرتب کرنے والے نے ایک کلاس Typeاور 3 nestedکلاسز سے اخذ کیا ہے Type۔

وراثت کے ساتھ decompiled enum-class

Typeمندرجہ بالا کی تصدیق کرنے کے لیے، ہم اوپر کی مثال سے گنتی کو ڈی کمپائل کرنے کا نتیجہ بھی پیش کرتے ہیں :جاوا میں شماریات (java enum) - 5

شماریات اور پیرامیٹرک پولیمورفزم

قاری حیران ہو سکتا ہے: " مذکورہ بالا قسم کی گنتی جنرک کیوں نہیں استعمال کرتی؟ " حقیقت یہ ہے کہ جاوا میں جنرک کا استعمال enumممنوع ہے۔ تو درج ذیل مثال مرتب نہیں ہوگی:
enum Type<T> {}

مزید پڑھائی

جاوا میں شماریات کیسے کام کرتی ہیں اس کی گہری تفہیم کے لیے، میں تجویز کرتا ہوں کہ آپ اپنے آپ کو کلاس کے سورس کوڈ سے واقف کرائیں java.lang.Enum، اور تیار کردہ کوڈ کا مطالعہ کرنے کے لیے Jad decompiler کا بھی استعمال کریں۔ مزید یہ کہ جاوا لائبریری کے سورس کوڈ کا مطالعہ یہ سمجھنے کے لیے بالکل ضروری ہے کہ جاوا میں کتنے میکانزم کام کرتے ہیں اور آبجیکٹ پر مبنی ڈیزائن کے حوالے کے طور پر مفید ہے۔ اصل ماخذ سے لنک: http://alexander.lds.lg.ua/
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION