JavaRush /جاوا بلاگ /Random-UR /جاوا میں آٹو باکسنگ اور ان باکسنگ
Viacheslav
سطح

جاوا میں آٹو باکسنگ اور ان باکسنگ

گروپ میں شائع ہوا۔
<h2>تعارف</h2>ایک پروگرامنگ زبان، جیسے کہ لوگ جو زبان بولتے ہیں، زندگی اور تبدیلیاں، اس میں نئے مظاہر ظاہر ہوتے ہیں تاکہ اس زبان کو استعمال میں زیادہ آسان بنایا جا سکے۔ اور جیسا کہ ہم جانتے ہیں، زبان کو آسانی سے ہمارے خیالات کا اظہار کرنا چاہیے۔
جاوا میں آٹو باکسنگ اور ان باکسنگ - 1
لہذا، Java SE 5 میں، باکسنگ/ان باکسنگ میکانزم متعارف کرایا گیا۔ اور اوریکل کا ایک علیحدہ ٹیوٹوریل خیالات کے اظہار کے اس ذرائع کی خصوصیات کے لیے وقف ہے: آٹو باکسنگ اور ان باکسنگ ۔ <h2>آٹو پیکنگ باکسنگ</h2>آئیے آٹو پیکنگ باکسنگ کی ایک مثال دیکھیں۔ سب سے پہلے، دیکھتے ہیں کہ یہ کیسے کام کرتا ہے. آئیے compilejava.net سائٹ استعمال کریں اور ایک کلاس بنائیں:

public class App {
    public static void main(String[] args) {
        Integer portNumber = 8080;
        if (args.length != 0) {
            portNumber = Integer.valueOf(args[0]);
        }
        System.out.println("Port number is: " + portNumber);
    }
}
سادہ کوڈ۔ ہم ان پٹ پیرامیٹر کی وضاحت کر سکتے ہیں اور پورٹ ویلیو کو تبدیل کر سکتے ہیں۔ جیسا کہ ہم دیکھتے ہیں، کیونکہ Stringہم پیرامیٹرز سے پورٹ ویلیو پڑھتے ہیں ، ہم Integerاسے حاصل کرکے حاصل کرتے ہیں Integer.valueOf۔ لہذا، ہم اسے ایک قدیم قسم کے طور پر نہیں بلکہ ایک آبجیکٹ کی قسم کے طور پر بیان کرنے پر مجبور ہیں Integer۔ اور یہاں ہم حاصل کرتے ہیں، ایک طرف، ہمارے پاس ایک آبجیکٹ متغیر ہے، اور ڈیفالٹ ویلیو ایک قدیم ہے۔ اور یہ کام کرتا ہے۔ لیکن ہم جادو میں یقین نہیں رکھتے، کیا ہم؟ آئیے ایک نظر ڈالتے ہیں "ہڈ کے نیچے،" جیسا کہ وہ کہتے ہیں۔ "زپ ڈاؤن لوڈ کریں" پر کلک کرکے compilejava.net سے سورس کوڈ ڈاؤن لوڈ کریں۔ اس کے بعد، ڈاؤن لوڈ کردہ آرکائیو کو ڈائرکٹری میں نکالیں اور اس پر جائیں۔ اب کرتے ہیں: javap -c -p App.classجہاں App.class آپ کی کلاس کے لیے مرتب شدہ کلاس فائل ہے۔ ہم اس طرح کا مواد دیکھیں گے:
جاوا میں آٹو باکسنگ اور ان باکسنگ - 2
یہ وہی بدنام زمانہ "بائٹ کوڈ" ہے۔ لیکن اب ہمارے لیے اہم یہ ہے کہ ہم کیا دیکھتے ہیں۔ سب سے پہلے، 8080 primitive کو میتھڈ ایگزیکیوشن اسٹیک پر رکھا جاتا ہے، اور پھر Integer.valueOf کو پھانسی دی جاتی ہے ۔ یہ باکسنگ کا "جادو" ہے۔ اور جادو کے اندر ایسا لگتا ہے:
جاوا میں آٹو باکسنگ اور ان باکسنگ - 3
یعنی، جوہر میں، ایک نیا لیا جائے گا یا کیشے سے Integerوصول کیا جائے گا (کیشے صرف عدد کی ایک صف سے زیادہ کچھ نہیں ہے) نمبر کی قدر کے لحاظ سے۔ Integerقدرتی طور پر، Integerنہ صرف ایک بہت خوش قسمت تھا. متعلقہ قدیم اقسام اور ان کے ریپرز کی ایک پوری فہرست ہے (کلاس جو OOP دنیا میں قدیم کی نمائندگی کرتی ہیں)۔ یہ فہرست اوریکل کے ٹیوٹوریل کے بالکل نیچے دی گئی ہے: " آٹو باکسنگ اور ان باکسنگ "۔ ابھی یہ بات قابل غور ہے کہ پرائمیٹوز سے بنی صفوں میں کسی بھی فریق ثالث کی لائبریریوں کو مربوط کیے بغیر "ریپر" نہیں ہوتا ہے۔ وہ. کی طرف سے ہمارے لیے Arrays.asListنہیں بنائے گا ۔ <h2>ان باکسنگ</h2>باکسنگ کے الٹ عمل کو ان باکسنگ ان باکسنگ کہا جاتا ہے۔ آئیے پیک کھولنے کی ایک مثال دیکھیں: int[]ListInteger

public class App {

    public static void main(String[] args) {
        if (args.length == 0) {
            System.out.println("Please, enter params");
            return;
        }
      	int value = Math.abs(Integer.valueOf(args[0]));
        System.out.println("Absolute value is: " + value);
    }

}
Math.absصرف primitives کو قبول کرتا ہے. کیا کرنا ہے؟ ریپر کلاس کے پاس اس کیس کے لیے ایک خاص طریقہ ہے جو ایک پرائمٹیو واپس کرتا ہے۔ مثال کے طور پر، یہ intValueInteger طریقہ ہے ۔ اگر ہم بائی کوڈ کو دیکھیں تو یہ اس طرح ہے:
جاوا میں آٹو باکسنگ اور ان باکسنگ - 4
جیسا کہ آپ دیکھ سکتے ہیں، کوئی جادو نہیں ہے. سب کچھ جاوا کے اندر ہے۔ یہ صرف "خود ہی" کام کرتا ہے۔ ہماری سہولت کے لیے۔ <h2>ریک</h2>
جاوا میں آٹو باکسنگ اور ان باکسنگ - 5
کوئی بھی آلہ، اگر غلط استعمال کیا جائے، تو وہ اپنے خلاف ایک زبردست ہتھیار بن جاتا ہے۔ اور جاوا میں خودکار باکسنگ/ان باکسنگ میکانزم بھی اس سے مستثنیٰ نہیں ہے۔ پہلا، واضح موازنہ کے ذریعے ہے ==۔ میرے خیال میں یہ واضح ہے، لیکن آئیے اسے دوبارہ دیکھتے ہیں:

public static void main(String[] args) {
    Integer inCacheValue = 127;
    Integer inCacheValue2 = 127;
    Integer notInCache = 128; // new Integer(129)
    Integer notInCache2 = 128; // new Integer(129)
    System.out.println(inCacheValue == inCacheValue2); //true
    System.out.println(notInCache == notInCache2); //false
}
پہلی صورت میں، قدر کو Integerویلیو کیش سے لیا جاتا ہے (اوپر باکسنگ کی وضاحت دیکھیں)، اور دوسری صورت میں ہر بار ایک نئی چیز بنائی جائے گی۔ لیکن یہاں یہ ریزرویشن کرنے کے قابل ہے۔ یہ سلوک کیشے ہائی باؤنڈ ( java.lang.Integer.IntegerCache.high ) پر منحصر ہے۔ اس کے علاوہ، دیگر ترتیبات کی وجہ سے یہ حد تبدیل ہو سکتی ہے۔ آپ اسٹیک اوور فلو پر اس موضوع پر بحث پڑھ سکتے ہیں: انٹیجر کیش کتنا بڑا ہے؟ قدرتی طور پر، اشیاء کو مساوی استعمال کرتے ہوئے موازنہ کرنے کی ضرورت ہے: System.out.println(notInCache.equals(notInCache2)); ایک ہی طریقہ کار سے منسلک دوسرا مسئلہ کارکردگی ہے۔ جاوا میں کوئی بھی باکسنگ ایک نئی چیز بنانے کے مترادف ہے۔ اگر نمبر کو کیش ویلیوز میں شامل نہیں کیا گیا ہے (یعنی -128 سے 127) تو ہر بار ایک نیا آبجیکٹ بنایا جائے گا۔ اگر اچانک پیکنگ (یعنی باکسنگ) ایک لوپ میں کی جاتی ہے، تو یہ غیر ضروری اشیاء اور کوڑا اٹھانے والے کے کام کے لیے وسائل کی کھپت میں بہت زیادہ اضافے کا سبب بنے گی۔ لہذا، اس کے بارے میں زیادہ لاپرواہ نہ ہو. تیسرا، کوئی کم تکلیف دہ ریک اسی طریقہ کار سے پیدا ہوتا ہے:

public static void check(Integer value) {
    if (value <= 0) {
        throw new IllegalStateException("Value is too small");
    }
}
اس کوڈ میں، وہ شخص واضح طور پر کوشش کر رہا تھا کہ غلطی سے گزر نہ جائے۔ لیکن اس کے لیے کوئی چیک نہیں ہے null۔ اگر یہ ان پٹ پر آتا ہے null، تو ایک قابل فہم غلطی کے بجائے ہمیں ایک ناقابل فہم غلطی ملے گی NullPointerException۔ کیونکہ مقابلے کے لیے، جاوا عمل کرنے value.intValueاور کریش کرنے کی کوشش کرے گا، کیونکہ... valueکرے nullگا <h2>نتیجہ</h2>باکسنگ/ان باکسنگ میکانزم پروگرامر کو کم کوڈ لکھنے کی اجازت دیتا ہے اور بعض اوقات قدیم سے اشیاء اور پیچھے میں تبدیل کرنے کے بارے میں سوچ بھی نہیں سکتا۔ لیکن اس کا مطلب یہ نہیں ہے کہ آپ کو یہ بھول جانا چاہیے کہ یہ کیسے کام کرتا ہے۔ دوسری صورت میں، آپ ایک غلطی کر سکتے ہیں جو فوری طور پر ظاہر نہیں ہوسکتی ہے. ہمیں سسٹم کے ان حصوں پر بھروسہ نہیں کرنا چاہیے جو مکمل طور پر ہمارے کنٹرول میں نہیں ہیں (جیسے انٹیجر باؤنڈری)۔ Integerلیکن ریپر کلاسز (جیسے ) کے تمام فوائد کے بارے میں مت بھولنا ۔ اکثر ان ریپر کلاسز میں اضافی جامد طریقوں کا ایک سیٹ ہوتا ہے جو آپ کی زندگی کو بہتر اور آپ کے کوڈ کو مزید اظہار بخش بناتا ہے۔ یہاں ایک پکڑنے والی مثال ہے:

public static void main(String[] args) {
    int first = 1;
    int second = 5;
    System.out.println(Integer.max(first, second));
    System.out.println(Character.toLowerCase('S'));
}
ہر چیز سے صحیح نتیجہ یہ نکلتا ہے کہ کوئی جادو نہیں ہوتا، کسی نہ کسی طرح کا احساس ہوتا ہے۔ اور ہر چیز ہمیشہ وہی نہیں ہوگی جس کی ہم توقع کرتے ہیں۔ مثال کے طور پر، کوئی پیکیجنگ نہیں ہے: System.out.println("The number is " + 8); اوپر دی گئی مثال کو کمپائلر کے ذریعے ایک لائن میں بہتر بنایا جائے گا۔ یعنی، ایسا ہی ہے جیسے آپ نے لکھا ہے "نمبر 8 ہے"۔ اور نیچے دی گئی مثال میں بھی کوئی پیکیجنگ نہیں ہوگی:

public static void main(String[] args) {
    System.out.println("The number is " + Math.abs(-2));
}
یہ کیسے ہو سکتا ہے جب ہم printlnکسی چیز کو بطور ان پٹ لیتے ہیں اور کسی نہ کسی طرح لائنوں کو جوڑنے کی ضرورت ہوتی ہے۔ لائنز... ہاں، اسی لیے اس طرح کی کوئی پیکیجنگ نہیں ہے۔ جامد طریقے ہیں Integer، لیکن ان میں سے کچھ ہیں package۔ یعنی، ہم انہیں استعمال نہیں کر سکتے، لیکن خود جاوا میں انہیں فعال طور پر استعمال کیا جا سکتا ہے۔ یہاں بالکل ایسا ہی ہے۔ getChars طریقہ کو کہا جائے گا، جو نمبر سے حروف کی ایک صف بناتا ہے۔ ایک بار پھر، کوئی جادو نہیں، صرف جاوا)۔ لہذا کسی بھی غیر واضح صورتحال میں، آپ کو صرف عمل درآمد کو دیکھنا ہوگا اور کم از کم کچھ تو ہو جائے گا۔ #ویاچسلاو
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION