CodeGym /جاوا بلاگ /Random-UR /آئیے جاوا میں حتمی مطلوبہ الفاظ کے بارے میں بات کرتے ہیں۔...
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
}
اب ایک چھوٹا سا انٹرویو کرتے ہیں۔ سب کے بعد، CodeGym کورس مکمل کرنے کا مقصد جاوا ڈویلپر بننا اور ایک دلچسپ اور اچھی تنخواہ والی نوکری تلاش کرنا ہے۔ تو، چلو شروع کرتے ہیں.
  1. ہم اس صف کے بارے میں کیا کہہ سکتے ہیں جسے حتمی قرار دیا گیا ہے؟

  2. ہم جانتے ہیں کہ String کلاس ناقابل تغیر ہے: کلاس کو حتمی قرار دیا جاتا ہے۔ ایک سٹرنگ ویلیو ایک چار صف میں محفوظ کی جاتی ہے جسے مطلوبہ الفاظ کے فائنل کے ساتھ نشان زد کیا جاتا ہے۔

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
کیا ہم کسی String آبجیکٹ کی قدر کو تبدیل کر سکتے ہیں (آبجیکٹ کا حوالہ تبدیل کیے بغیر)؟ یہ انٹرویو کے حقیقی سوالات ہیں۔ اور مشق سے پتہ چلتا ہے کہ بہت سے امیدوار ان کا صحیح جواب نہیں دیتے۔ یہ سمجھنا کہ حتمی کلیدی لفظ کس طرح استعمال ہوتا ہے، خاص طور پر حوالہ متغیر کے لیے، بہت اہم ہے۔ جب آپ اس پر غور کریں گے، میں CodeGym ٹیم سے ایک چھوٹی سی درخواست کروں گا۔ براہ کرم ٹیکسٹ ایڈیٹر کو ایک ایسا بلاک شامل کرنے کی صلاحیت دیں جس پر کلک کرنے پر مواد دکھایا/چھپایا جا سکے۔ جوابات:
  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. ہاں ہم کر سکتے ہیں. اہم بات یہ سمجھنا ہے کہ جب اشیاء کے ساتھ استعمال کیا جائے تو کانٹے دار حتمی مطلوبہ لفظ کا کیا مطلب ہے۔ 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
         */
    }
}
براہ کرم نوٹ کریں کہ اگر ہم نے اس طرح سے ایک قدیم قسم کے حتمی تغیر کو تبدیل کرنے کی کوشش کی ہوتی تو کچھ بھی نہ ہوتا۔ میں تجویز کرتا ہوں کہ آپ اپنے آپ کو قائل کریں: جاوا کلاس بنائیں، مثال کے طور پر، حتمی int فیلڈ کے ساتھ اور Reflection API کا استعمال کرتے ہوئے اس کی قدر کو تبدیل کرنے کی کوشش کریں۔ سب کو گڈ لک!
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION