JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ آٽو باڪسنگ ۽ انباڪسنگ
Viacheslav
سطح

جاوا ۾ آٽو باڪسنگ ۽ انباڪسنگ

گروپ ۾ شايع ٿيل
<h2>تعارف</h2>هڪ پروگرامنگ ٻولي، جيئن ماڻهو ڳالهائين ٿا ٻولي، زندگيون ۽ تبديليون، ان ۾ نوان رجحان ظاهر ٿين ٿا ته جيئن ٻوليءَ کي استعمال ڪرڻ ۾ وڌيڪ آسان بڻائي سگهجي. ۽ جيئن اسان ڄاڻون ٿا، ٻولي آسانيء سان اسان جي خيالن جو اظهار ڪرڻ گهرجي.
جاوا ۾ آٽو باڪسنگ ۽ انباڪسنگ - 1
تنهن ڪري، جاوا SE 5 ۾، باڪسنگ / انباڪسنگ ميڪانيزم متعارف ڪرايو ويو. ۽ Oracle کان هڪ الڳ ٽيوٽوريل، خيالن جي اظهار جي هن وسيلا جي خاصيتن لاءِ وقف آهي: آٽو باڪسنگ ۽ انباڪسنگ . <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
هي ساڳيو بدنام آهي “bytecode”. پر هاڻي اسان لاءِ اهم آهي ته اسان ڇا ٿا ڏسون. پهرين، 8080 پرائمري طريقي سان عمل جي اسٽيڪ تي رکيل آهي، ۽ پوء Integer.valueOf تي عمل ڪيو ويو آهي . هي باڪسنگ جو "جادو" آهي. ۽ اندر جو جادو هن طرح ڏسڻ ۾ اچي ٿو:
جاوا ۾ آٽو باڪسنگ ۽ انباڪسنگ - 3
اهو آهي، جوهر ۾، هڪ نئون ورتو ويندو Integerيا ڪيش مان وصول ڪيو ويندو Integer(ڪيش صرف انٽيجرز جي هڪ صف کان وڌيڪ ناهي) انگ جي قيمت تي منحصر آهي. قدرتي طور، Integerنه رڳو ايترو خوش قسمت هو. هتي لاڳاپيل ابتدائي قسمن جي هڪ مڪمل فهرست آهي ۽ انهن جي لفافي (ڪلاس جيڪي OOP دنيا ۾ پرائمري جي نمائندگي ڪن ٿا). ھي لسٽ ڏنل آھي ھيٺ ڏنل سبق جي بلڪل ھيٺان Oracle کان: ” آٽو باڪسنگ ۽ انباڪسنگ “. اهو فوري طور تي نوٽ ڪرڻ جي قابل آهي ته پراڻين مان ٺهيل صفون ڪنهن به ٽئين پارٽي جي لائبريرين کي ڳنڍڻ کان سواء "ريپر" نه هونديون آهن. اهي. جي مان اسان لاءِ Arrays.asListنه ٺاهيندو . <h2>Unboxing</h2>باڪسنگ ڏانهن موٽڻ واري عمل کي انباڪسنگ انباڪسنگ چئبو آهي. اچو ته هڪ unpacking مثال ڏسو: 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صرف ابتدائي قبول ڪري ٿو. ڇا ڪجي؟ ريپر ڪلاس وٽ ھن ڪيس لاءِ ھڪڙو خاص طريقو آھي جيڪو ھڪڙو پريم موٽائي ٿو. مثال طور، هي 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