JavaRush /جاوا بلاگ /Random-UR /لپیٹنا، کھولنا اور پیک کرنا

لپیٹنا، کھولنا اور پیک کرنا

گروپ میں شائع ہوا۔
ہیلو! آپ پہلے سے ہی قدیم اقسام سے کافی واقف ہیں، اور آپ نے ان کے ساتھ بہت کام کیا ہے۔ لپیٹنا، کھولنا اور پیک کرنا - 1پروگرامنگ اور خاص طور پر جاوا میں پرائمیٹوز کے بہت سے فوائد ہیں: وہ بہت کم میموری لیتے ہیں، اس طرح پروگرام کی کارکردگی میں اضافہ ہوتا ہے، اور واضح طور پر اقدار کی حدود میں تقسیم ہوتے ہیں۔ تاہم، جاوا سیکھنے کے عمل میں، ہم نے منتر کی طرح ایک سے زیادہ بار دہرایا ہے، " جاوا میں ہر چیز ایک چیز ہے ۔" لیکن قدیم ان الفاظ کی براہ راست تردید ہے۔ وہ اشیاء نہیں ہیں۔ تو کیا یہ اصول "ہر چیز ایک چیز ہے" غلط ہے؟ واقعی نہیں۔ جاوا میں، ہر قدیم قسم کا جڑواں بھائی ہوتا ہے، ریپر کلاس ( Wrapper)۔ ایک چادر کیا ہے؟ ریپر ایک خاص طبقہ ہے جو اپنے اندر ایک قدیم کی قدر کو محفوظ کرتا ہے۔ لیکن چونکہ یہ ایک کلاس ہے اس لیے یہ اپنی مثالیں بنا سکتا ہے۔ وہ اصلی اشیاء ہوتے ہوئے ضروری قدیم اقدار کو اندر محفوظ کریں گے۔ ریپر کلاسز کے نام متعلقہ پرائمیٹوز کے ناموں سے بہت ملتے جلتے ہیں، یا مکمل طور پر ان کے ساتھ ملتے ہیں۔ اس لیے انہیں یاد رکھنا بہت آسان ہوگا۔
قدیم ڈیٹا کی اقسام کے لیے ریپر کلاسز
قدیم ڈیٹا کی اقسام ریپر کلاسز
int عدد
مختصر مختصر
طویل لمبی
بائٹ بائٹ
تیرنا تیرنا
دگنا دگنا
چار کردار
بولین بولین
ریپر کلاس آبجیکٹ کسی دوسرے کی طرح بنائے جاتے ہیں:
public static void main(String[] args) {

   Integer i = new Integer(682);

   Double d = new Double(2.33);

   Boolean b = new Boolean(false);
}
ریپر کلاسز آپ کو ان نقصانات کو کم کرنے کی اجازت دیتی ہیں جو قدیم اقسام کے ہوتے ہیں۔ سب سے واضح بات یہ ہے کہ قدیم لوگوں کے پاس طریقے نہیں ہوتے ہیں ۔ مثال کے طور پر، ان کے پاس کوئی طریقہ نہیں ہے ، لہذا آپ، مثال کے طور پر، کسی نمبر کو سٹرنگ میں toString()تبدیل نہیں کر سکتے ۔ intلیکن ریپر کلاس کے ساتھ Integerیہ آسان ہے۔
public static void main(String[] args) {

   Integer i = new Integer(432);

   String s = i.toString();
}
ریورس ٹرانسفارمیشن میں بھی مشکلات ہوں گی۔ ہم کہتے ہیں کہ ہمارے پاس ایک سٹرنگ ہے جسے ہم یقینی طور پر جانتے ہیں کہ ایک نمبر پر مشتمل ہے۔ تاہم، ایک قدیم قسم کی صورت میں، intہم اس نمبر کو سٹرنگ سے حاصل نہیں کر سکیں گے اور اسے، حقیقت میں، ایک نمبر میں تبدیل نہیں کر سکیں گے۔ لیکن ریپر کلاسز کا شکریہ، اب ہمارے پاس یہ موقع ہے۔
public static void main(String[] args) {

   String s = "1166628";

   Integer i = Integer.parseInt(s);

   System.out.println(i);
}
آؤٹ پٹ: 1166628 ہم نے کامیابی کے ساتھ سٹرنگ سے ایک نمبر حاصل کیا ہے اور اسے ایک حوالہ متغیر کو تفویض کیا ہے Integer i۔ ویسے، لنکس کے بارے میں. آپ پہلے ہی جان چکے ہیں کہ پیرامیٹرز کو طریقوں سے مختلف طریقوں سے منتقل کیا جاتا ہے: پرائمیٹو کو قدر کے ذریعے منتقل کیا جاتا ہے، اور اشیاء کو حوالہ سے منتقل کیا جاتا ہے۔ آپ اپنے طریقے بناتے وقت اس علم کا استعمال کر سکتے ہیں: اگر آپ کا طریقہ کام کرتا ہے، مثال کے طور پر، فریکشنل نمبرز کے ساتھ، لیکن آپ کو حوالہ سے گزرنے کی منطق کی ضرورت ہے، تو آپ پیرامیٹر کو طریقہ کار کے Double/Floatبجائے پاس کر سکتے ہیں double/float۔ اس کے علاوہ، طریقوں کے علاوہ، ریپر کلاسز میں جامد فیلڈز ہوتے ہیں جو استعمال کرنے میں بہت آسان ہوتے ہیں۔ مثال کے طور پر، تصور کریں کہ اب آپ کو ایک کام کا سامنا ہے: کنسول پر زیادہ سے زیادہ ممکنہ نمبر پرنٹ کریں int، اور پھر کم سے کم ممکنہ نمبر۔ ایسا لگتا ہے کہ یہ کام ابتدائی ہے، لیکن پھر بھی، آپ گوگل کے بغیر مشکل سے ہی کر پائیں گے۔ اور ریپر کلاسز آپ کو درج ذیل "روزمرہ کے مسائل" کو آسانی سے حل کرنے کی اجازت دیتی ہیں۔
public class Main {
   public static void main(String[] args) {

       System.out.println(Integer.MAX_VALUE);
       System.out.println(Integer.MIN_VALUE);
   }
}
اس طرح کے شعبے آپ کو زیادہ سنجیدہ کاموں سے مشغول نہ ہونے دیتے ہیں۔ اس حقیقت کا تذکرہ نہ کرنا کہ نمبر 2147483647 پرنٹ کرنے کے عمل میں (یہ بالکل MAX_VALUE ہے) اسے غلط ٹائپ کرنا کوئی تعجب کی بات نہیں ہے :) اس کے علاوہ، پچھلے لیکچرز میں سے ایک میں ہم نے پہلے ہی اس حقیقت کی طرف توجہ مبذول کرائی تھی کہ ریپر کلاسز کی اشیاء ناقابل تغیر ہیں
public static void main(String[] args) {

   Integer a = new Integer(0);
   Integer b = new Integer(0);

   b = a;
   a = 1;
   System.out.println(b);
}
آؤٹ پٹ: 0 آبجیکٹ جس کی طرف حوالہ نے اصل میں اشارہ کیا تھا аاس کی حالت نہیں بدلی ہے، ورنہ قدر bبھی بدل جاتی۔ جیسا کہ String، ریپر آبجیکٹ کی حالت کو تبدیل کرنے کے بجائے، میموری میں ایک بالکل نیا آبجیکٹ بنایا جاتا ہے۔ جاوا کے تخلیق کاروں نے آخرکار قدیم اقسام کو زبان میں رکھنے کا فیصلہ کیوں کیا؟ چونکہ ہر چیز کو ایک آبجیکٹ ہونا چاہیے، اور ہمارے پاس پہلے سے ہی ریپر کلاسز موجود ہیں جن کا استعمال ہر اس چیز کو ظاہر کرنے کے لیے کیا جا سکتا ہے جس کا پرائمیٹو اظہار کرتے ہیں، تو کیوں نہ انہیں زبان میں چھوڑ کر پرائمیٹو کو ہٹا دیا جائے؟ جواب آسان ہے - کارکردگی۔ قدیم اقسام کو قدیم کہا جاتا ہے کیونکہ وہ اشیاء کی بہت سی "بھاری" خصوصیات سے خالی ہیں۔ ہاں، کسی شے کے بہت سے آسان طریقے ہوتے ہیں، لیکن آپ کو ہمیشہ ان کی ضرورت نہیں ہوتی۔ کبھی کبھی آپ کو صرف نمبر 33، یا 2.62، یا true/ کی قدر کی ضرورت ہوتی ہے false۔ ایسی حالتوں میں جہاں اشیاء کے تمام فوائد غیر متعلقہ ہیں اور پروگرام کے کام کرنے کی ضرورت نہیں ہے، پرائمیٹوز زیادہ بہتر کام کریں گے۔

آٹو پیکنگ/آٹو پیکنگ

جاوا میں پرائمیٹوز اور ان کی ریپر کلاسز کی ایک خصوصیت آٹو باکسنگ/آٹون باکسنگ ہے۔ لپیٹنا، کھولنا اور پیک کرنا - 2 آئیے اس تصور کو سمجھتے ہیں۔ جیسا کہ آپ اور میں نے پہلے ہی سیکھا ہے، جاوا ایک آبجیکٹ پر مبنی زبان ہے۔ اس کا مطلب ہے کہ جاوا میں لکھے گئے تمام پروگرام آبجیکٹ سے بنے ہیں۔ قدیم چیزیں اشیاء نہیں ہیں۔ تاہم، ریپر کلاس متغیر کو ایک قدیم قسم کی قدر تفویض کی جا سکتی ہے۔ اس عمل کو آٹو باکسنگ کہا جاتا ہے ۔ اسی طرح، ایک قدیم قسم کے متغیر کو ریپر کلاس کا ایک آبجیکٹ تفویض کیا جا سکتا ہے۔ اس عمل کو آٹو ان باکسنگ کہا جاتا ہے ۔ مثال کے طور پر:
public class Main {
   public static void main(String[] args) {
       int x = 7;
       Integer y = 111;
       x = y; // auto unpacking
       y = x * 123; // autopacking
   }
}
لائن 5 پر، ہم primitive x کو y کی قدر تفویض کرتے ہیں، جو کہ ریپر کلاس کی ایک چیز ہے Integer۔ جیسا کہ آپ دیکھ سکتے ہیں، اس کے لیے کسی اضافی کارروائی کی ضرورت نہیں ہے: مرتب کرنے والا جانتا ہے کہ intاور Integer، حقیقت میں، وہی چیز ۔ یہ خودکار پیکنگ ہے۔ لائن 6 میں آٹو باکسنگ کے ساتھ بھی ایسا ہی ہوتا ہے: آبجیکٹ y کو آسانی سے پرائمیٹو (x*123) کی قدر تفویض کی جاتی ہے۔ یہ آٹو پیکنگ کی ایک مثال ہے۔ یہی وجہ ہے کہ "آٹو" کا لفظ شامل کیا گیا ہے: ان کی ریپر کلاسز (اور اس کے برعکس) کی اشیاء کو قدیم حوالہ جات تفویض کرنے کے لیے آپ کو کچھ کرنے کی ضرورت نہیں ہے، سب کچھ خود بخود ہو جاتا ہے ۔ آسان، ٹھیک ہے؟ :) آٹو پیکنگ/آٹو پیکنگ کی ایک اور بہت بڑی سہولت طریقوں کے آپریشن میں ظاہر ہوتی ہے۔ حقیقت یہ ہے کہ طریقہ کار کے پیرامیٹرز بھی آٹو پیکنگ اور آٹو ان پیکنگ کے تابع ہیں ۔ اور، مثال کے طور پر، اگر ان میں سے کوئی دو اشیاء کو بطور ان پٹ لیتا ہے Integer، تو ہم وہاں پر عام پرائمٹیو کو آسانی سے منتقل کر سکتے ہیں int!
public class Main {
   public static void main(String[] args) {

       printNumber(7);//regular int, even without a variable
   }

   public static void printNumber(Integer i) {
       System.out.println("You entered a number" + i);
   }
}
آؤٹ پٹ: آپ نے نمبر 7 درج کیا ہے۔ یہ دوسرے طریقے سے کام کرتا ہے:
public class Main {
   public static void main(String[] args) {

       printNumber(new Integer(632));
   }

   public static void printNumber(int i) {
       System.out.println("You entered a number" + i);
   }
}
یاد رکھنے کے لیے ایک اہم نکتہ: آٹو باکسنگ اور ان باکسنگ صفوں کے لیے کام نہیں کرتی !
public class Main {
   public static void main(String[] args) {

       int[] i = {1,2,3,4,5};

       printArray(i);//error, won't compile!
   }

   public static void printArray(Integer[] arr) {
       System.out.println(Arrays.toString(arr));
   }
}
پرائمیٹوز کی ایک صف کو کسی ایسے طریقہ پر منتقل کرنے کی کوشش کرنا جو اشیاء کی ایک صف کو بطور ان پٹ لیتا ہے تالیف کی خرابی کا سبب بنے گا۔ آخر میں، آئیے ایک بار پھر مختصراً پرائمیٹوز اور ریپرز پرائمیٹوز کا موازنہ کریں:
  • کارکردگی کا فائدہ ہے
ریپرز:
  • وہ آپ کو "ہر چیز ایک چیز ہے" کے اصول کی خلاف ورزی نہ کرنے کی اجازت دیتے ہیں، تاکہ اعداد، علامتیں اور بولین قدریں صحیح/غلط اس تصور سے باہر نہ آئیں
  • آسان طریقے اور فیلڈز فراہم کرکے ان اقدار کے ساتھ کام کرنے کی صلاحیت کو بڑھائیں۔
  • ضروری ہے جب کوئی طریقہ صرف اشیاء کے ساتھ کام کر سکے۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION