پروگرامنگ کرتے وقت، ہمیں اکثر ڈیٹا کی مخصوص قسم کے لیے درست اقدار کے سیٹ کو محدود کرنے کی ضرورت کا سامنا کرنا پڑتا ہے۔ لہذا، مثال کے طور پر، ہفتے کے دن کی 7 مختلف اقدار ہو سکتی ہیں، سال کے مہینے میں 12 ہو سکتے ہیں، اور سیزن میں 4 ہو سکتے ہیں۔ اس طرح کے مسائل کو حل کرنے کے لیے، بہت سی statically ٹائپ شدہ پروگرامنگ زبانیں ایک خاص ڈیٹا ٹائپ فراہم کرتی ہیں۔ گنتی ( اینوم ممبران
عناصر -کلاس کی
enum
) جاوا میں ابھی گنتی ظاہر نہیں ہوئی۔ enum
ورژن 1.5 سے شروع ہونے والی ایک خصوصی زبان کی تعمیر کو متعارف کرایا گیا تھا۔ اس وقت تک، پروگرامرز نے گنتی کو لاگو کرنے کے لیے دوسرے طریقے استعمال کیے ہیں۔
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 и т.д.)
جامد طور پر قابل رسائی مثالیں ہیں ۔ ان کی جامد دستیابی ہمیں حوالہ موازنہ آپریٹر کا استعمال کرتے ہوئے موازنہ کرنے کی اجازت دیتی ہے ۔ مثال: enum
Season
==
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
یقینی طور پر پھینک دیا جائے گا ۔ لیکن یہ نقطہ کے سوا ہے. آئیے جاری رکھیں۔ شمار کے تمام عناصر کو حاصل کرنا بعض اوقات آپ کو رن ٹائم میں کلاس کے تمام عناصر کی فہرست حاصل کرنے کی ضرورت ہوتی ہے ۔ ان مقاصد کے لیے، مرتب کرنے والا ہر ایک کلاس میں ایک طریقہ تیار کرتا ہے ۔ استعمال کی مثال: enum
enum
public static EnumClass[] values()
System.out.println(Arrays.toString(Season.values()));
ہمیں درج ذیل آؤٹ پٹ ملتا ہے:
[WINTER, SPRING, SUMMER, AUTUMN]
نوٹ کریں کہ کلاس میں نہ تو طریقہ valueOf()
اور نہ ہی طریقہ کی تعریف کی گئی ہے ۔ اس کے بجائے، وہ خود بخود مرتب کرنے والے کے ذریعہ شامل ہوجاتے ہیں جب -class مرتب کیا جاتا ہے۔ -کلاس میں اپنے طریقے شامل کرنا آپ کے پاس اپنے طریقوں کو -کلاس اور اس کے عناصر دونوں میں شامل کرنے کا موقع ہے : ایک ہی، لیکن کثیر المثالیت کے ساتھ: آخری مثال میں وراثت کے استعمال کو ظاہر کرتی ہے ۔ اس پر مزید بعد میں۔ جاوا میں وراثت آپ کو طبقاتی درجہ بندی کو نافذ کرنے کی اجازت دیتا ہے، جس کی اشیاء ایک ہی مثال میں بنائی جاتی ہیں اور مستحکم طور پر قابل رسائی ہوتی ہیں۔ اس صورت میں، عناصر اپنے کنسٹرکٹرز پر مشتمل ہو سکتے ہیں۔ آئیے ایک مثال دیتے ہیں: یہاں ہم تین عناصر کے ساتھ ایک شمار کا اعلان کرتے ہیں ، اور . مرتب کرنے والا درج ذیل کلاسز اور اشیاء بنائے گا: values()
java.lang.Enum
enum
enum
enum
enum
enum
enum
enum
Type
INT
INTEGER
STRING
Type
--.کلاس سے ماخوذ ۔java.lang.Enum
INT
— پہلی کلاس کا اعتراض جس سے اخذ کیا گیا ہے۔Type
INTEGER
— 2nd کلاس کا اعتراض جس سے اخذ کیا گیا ہے۔Type
STRING
3rd کلاس کا اعتراض جس سے اخذ کیا گیا ہے۔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
مندرجہ بالا کی تصدیق کرنے کے لیے، ہم اوپر کی مثال سے گنتی کو ڈی کمپائل کرنے کا نتیجہ بھی پیش کرتے ہیں :
شماریات اور پیرامیٹرک پولیمورفزم
قاری حیران ہو سکتا ہے: " مذکورہ بالا قسم کی گنتی جنرک کیوں نہیں استعمال کرتی؟ " حقیقت یہ ہے کہ جاوا میں جنرک کا استعمالenum
ممنوع ہے۔ تو درج ذیل مثال مرتب نہیں ہوگی:
enum Type<T> {}
مزید پڑھائی
جاوا میں شماریات کیسے کام کرتی ہیں اس کی گہری تفہیم کے لیے، میں تجویز کرتا ہوں کہ آپ اپنے آپ کو کلاس کے سورس کوڈ سے واقف کرائیںjava.lang.Enum
، اور تیار کردہ کوڈ کا مطالعہ کرنے کے لیے Jad decompiler کا بھی استعمال کریں۔ مزید یہ کہ جاوا لائبریری کے سورس کوڈ کا مطالعہ یہ سمجھنے کے لیے بالکل ضروری ہے کہ جاوا میں کتنے میکانزم کام کرتے ہیں اور آبجیکٹ پر مبنی ڈیزائن کے حوالے کے طور پر مفید ہے۔ اصل ماخذ سے لنک: http://alexander.lds.lg.ua/
GO TO FULL VERSION