CodeGym /جاوا بلاگ /Random-SD /اچو ته جاوا ۾ فائنل ڪي ورڊ بابت ڳالهايون
John Squirrels
سطح
San Francisco

اچو ته جاوا ۾ فائنل ڪي ورڊ بابت ڳالهايون

گروپ ۾ شايع ٿيل
جاوا وٽ ھي لفظ آھي - فائنل. اهو طبقن، طريقن، متغيرن تي لاڳو ٿي سگهي ٿو (بشمول طريقو پيٽرولر). هڪ طبقي لاءِ، آخري لفظ جو مطلب آهي ته ڪلاس ۾ ذيلي ڪلاس نه هوندا، يعني وراثت منع ٿيل آهي... هي ڪارائتو آهي جڏهن ناقابل تبديلي (غير تبديل ٿيندڙ) شيون ٺاهي. مثال طور، String طبقي کي حتمي قرار ڏنو ويو آهي.
public final class String {
}

class SubString extends String { // Compilation error
}
مون کي اهو به ياد رکڻ گهرجي ته حتمي ترميم ڪندڙ تجريدي طبقن تي لاڳو نه ٿو ڪري سگهجي (جيڪي لفظ خلاصي سان گڏ آهن)، ڇاڪاڻ ته اهي هڪ ٻئي سان خاص تصور آهن. حتمي طريقي لاءِ، ترميم ڪندڙ جو مطلب آهي ته طريقو ذيلي طبقن ۾ ختم نٿو ڪري سگهجي. اهو ڪارائتو آهي جڏهن اسان اصل عمل جي تبديلي کي روڪڻ چاهيون ٿا.
public class SuperClass {
    public final void printReport() {
        System.out.println("Report");
    }
}

class SubClass extends SuperClass {
    public void printReport() { //Compilation error
        System.out.println("MyReport");
    }
}
هڪ ابتدائي قسم جي متغيرن لاءِ، آخري لفظ جو مطلب اهو آهي ته قيمت، هڪ ڀيرو مقرر ڪئي وئي، تبديل نه ٿي ڪري سگھجي. ريفرنس متغيرن لاءِ، ان جو مطلب آهي ته هڪ شئي جي تفويض ٿيڻ کان پوءِ، توهان ان اعتراض جو حوالو تبديل نٿا ڪري سگهو. هي اهم آهي! حوالو تبديل نه ٿو ڪري سگھجي، پر اعتراض جي حالت کي تبديل ڪري سگھجي ٿو. جاوا 8 هڪ نئون تصور متعارف ڪرايو: مؤثر طور تي فائنل. اهو صرف متغيرن تي لاڳو ٿئي ٿو (بشمول طريقو پيٽرولر). هيٺئين لائن اها آهي ته حتمي لفظ جي واضح غير موجودگي جي باوجود، متغير جي قيمت شروعاتي ٿيڻ کان پوء تبديل نه ٿيندي. ٻين لفظن ۾، حتمي لفظ لاڳو ڪري سگھجي ٿو اهڙي متغير تي بغير تاليف جي غلطي. مؤثر طور تي فائنل متغير استعمال ڪري سگھجن ٿا مقامي طبقن (مقامي اندروني طبقن)، گمنام طبقن (گمنام اندروني طبقن)، ۽ اسٽريمز (اسٽريم API).
public void someMethod() {
    // In the example below, both a and b are effectively final, since they are assigned values only once:
    int a = 1;
    int b;
    if (a == 2) b = 3;
    else b = 4;
    // c is NOT effectively final since its value changes
    int c = 10;
    c++;

    Stream.of(1, 2).forEach(s-> System.out.println(s + a)); // OK
    Stream.of(1, 2).forEach(s-> System.out.println(s + c)); // Compilation error
}
هاڻي اچو ته ٿورو انٽرويو ڪريون. آخرڪار، ڪوڊ گيم ڪورس مڪمل ڪرڻ جو مقصد جاوا ڊولپر ٿيڻ ۽ هڪ دلچسپ ۽ سٺي ادا ڪيل نوڪري ڳولڻ آهي. سو، اچو ته شروع ڪريون.
  1. اسان هڪ صف بابت ڇا چئي سگهون ٿا جيڪو حتمي قرار ڏنو ويو آهي؟

  2. اسان ڄاڻون ٿا ته اسٽرنگ ڪلاس غير بدليل آهي: ڪلاس کي حتمي قرار ڏنو ويو آهي. هڪ اسٽرنگ جي قيمت هڪ چار صف ۾ محفوظ ڪئي وئي آهي جيڪا لفظ فائنل سان نشان لڳل آهي.

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
ڇا اسان String اعتراض جي قيمت کي تبديل ڪري سگھون ٿا (بغير اعتراض جي حوالي کي تبديل ڪرڻ جي)؟ اهي حقيقي انٽرويو سوال آهن. ۽ مشق ڏيکاري ٿو ته ڪيترائي اميدوار انهن کي صحيح جواب نه ڏيندا آهن. سمجھڻ ته ڪيئن حتمي لفظ استعمال ڪيو ويندو آھي، خاص طور تي حوالن جي متغير لاء، تمام ضروري آھي. جئين توهان هن تي غور ڪندا، مان ڪوڊ گيم ٽيم کي هڪ ننڍڙي درخواست ڪندس. مھرباني ڪري ٽيڪسٽ ايڊيٽر کي ھڪ بلاڪ شامل ڪرڻ جي صلاحيت ڏيو جنھن جو مواد ڏيکاريو/ لڪائي سگھجي ٿو جڏھن توھان ان تي ڪلڪ ڪندا. جواب:
  1. هڪ صف هڪ اعتراض آهي، تنهن ڪري آخري لفظ جو مطلب آهي ته هڪ ڀيرو صف جو حوالو لڳايو ويو آهي، حوالو تبديل نه ٿو ڪري سگهجي. اھو چيو، توھان تبديل ڪري سگھو ٿا اعتراض جي حالت.

    final int[] array = {1, 2, 3, 4, 5};
    array[0] = 9;	 // OK, because we're changing the contents of the array: {9, 2, 3, 4, 5}
    array = new int[5]; // Compilation error
  2. ها اسان ڪري سگھون ڀا. مکيه شيء اهو سمجهڻ آهي ته thorny فائنل لفظ جو مطلب ڇا آهي جڏهن شين سان استعمال ڪيو وڃي. Reflection API قدرن کي تبديل ڪرڻ لاءِ استعمال ڪري سگھجي ٿو.

import java.lang.reflect.Field;

class B {
    public static void main(String[] args) throws Exception {
        String value = "Old value";
        System.out.println(value);

        // Get the String class's value field
        Field field = value.getClass().getDeclaredField("value");
        // Make it mutable
        field.setAccessible(true);
        // Set a new value
        field.set(value, "CodeGym".toCharArray());

        System.out.println(value);

        /* Output:
         * Old value
         * CodeGym
         */
    }
}
مهرباني ڪري نوٽ ڪريو ته جيڪڏهن اسان هن طريقي سان هڪ ابتدائي قسم جي آخري متغير کي تبديل ڪرڻ جي ڪوشش ڪئي هئي ته پوء ڪجهه به نه ٿئي ها. مان صلاح ڏيان ٿو ته توهان پاڻ کي قائل ڪريو: هڪ جاوا ڪلاس ٺاهيو، مثال طور، فائنل انٽ فيلڊ سان ۽ ان جي قيمت تبديل ڪرڻ جي ڪوشش ڪريو Reflection API استعمال ڪندي. سڀني کي سٺي قسمت!
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION