CodeGym /جاوا بلاگ /Random-UR /جاوا دائرہ کار
John Squirrels
سطح
San Francisco

جاوا دائرہ کار

گروپ میں شائع ہوا۔
ہم سب جانتے ہیں کہ ممالک کی سرحدیں اور ان کے اپنے قوانین ہوتے ہیں۔ ملک کے قوانین سرحدوں کے اندر رہتے ہیں۔ اس کے علاوہ ملک میں ایسی تنظیمیں ہیں، مثلاً اسکول یا عجائب گھر، جن کے اپنے مقامی اصول ہیں۔ وہ ملک کے قوانین سے متصادم نہیں ہیں، لیکن صرف مخصوص تنظیم کے فریم ورک کے اندر کام کرتے ہیں۔ پروگرامنگ میں بھی ایسا ہی ہے۔ لہذا پروگرامنگ میں، اور خاص طور پر جاوا زبان میں، ایک اصطلاح ہے "اسکوپ"۔ یہ پروگرام کے ان علاقوں سے مراد ہے جہاں کچھ ڈیٹا، جیسے متغیرات یا طریقے، کام کرتے ہیں۔ اس مضمون میں، ہم یہ جاننے جا رہے ہیں کہ جاوا میں متغیرات کے لیے کیا اسکوپس ہیں اور ان کی وضاحت کیسے کی جائے۔

عام طور پر جاوا اسکوپ

متغیرات اور طریقوں کے دائرہ کار کو الگ کرنا کیوں ضروری ہے؟ حقیقت یہ ہے کہ بعض اوقات پروگرام بہت بڑے ہوتے ہیں اور ایک یا دوسرے متغیر کو ٹریک کرنا مشکل ہو سکتا ہے۔ اس کے علاوہ، بڑے منصوبوں میں، متغیرات کا واضح نام ضروری ہے تاکہ یہ واضح ہو کہ وہ کس کے لیے ہیں۔ اسکوپ خاص طور پر آپ کو پروگرام کے مختلف حصوں میں ایک ہی نام کے ساتھ مختلف متغیرات رکھنے کی اجازت دیتا ہے۔ اس طرح کے کوڈ کو برقرار رکھنا اور پڑھنا آسان ہے۔ جاوا اسکوپ اس بات کی وضاحت کرتا ہے کہ پروگرام میں ایک مخصوص متغیر یا طریقہ کہاں قابل رسائی ہے۔ مختصراً:
  • ایک طریقہ میں اعلان کردہ متغیر اعلان کے آغاز سے طریقہ کے اختتام تک نظر آتا ہے (طریقہ کا دائرہ کار)۔
  • کوڈ بلاک میں اعلان کردہ ایک متغیر اس کوڈ بلاک کے اختتام تک موجود رہتا ہے۔
  • متغیرات جو کہ طریقہ کار کے دلائل ہیں طریقہ کے اختتام تک موجود ہیں۔
  • کلاس/آبجیکٹ متغیرات پر مشتمل آبجیکٹ کی زندگی بھر کے لیے موجود ہیں۔ ان کی مرئیت کو خصوصی رسائی میں ترمیم کرنے والوں کے ذریعے منظم کیا جاتا ہے۔
  • جامد کلاس متغیر ہر وقت موجود رہتے ہیں جب پروگرام چل رہا ہے۔ ان کی مرئیت کا تعین رسائی میں ترمیم کرنے والوں سے بھی ہوتا ہے۔

طریقہ کی سطح کا دائرہ کار

ایک طریقہ میں اعلان کردہ کوئی بھی متغیر، بشمول دلائل، اس طریقہ سے باہر قابل رسائی نہیں ہے۔ طریقوں کے اندر اعلان کردہ تمام متغیرات اپنے اعلان کے آغاز سے طریقہ کے اختتام تک نظر آتے ہیں۔ طریقہ متغیر دائرہ کار کی ایک مثال یہ ہے:

public class JScopeTest1 {


   public static void main(String[] args) {

       System.out.println(myMethod(5));
       System.out.println(myMethod(17));

   }
   public static int  myMethod(int arg) {
       int secondArg = 100; //local method variable
       return secondArg + arg;
   }
}
یہاں ہمارے پاس ہے secondArg ، ایک مقامی متغیر یا طریقہ دلیل۔ ہم اس متغیر کو myMethod طریقہ سے باہر یا اس کے اعلان سے پہلے استعمال نہیں کر سکتے ۔ اگر متغیر فنکشن کی دلیل ہے، تو یہ اس طریقہ کار کے پورے جسم میں نظر آتا ہے۔ اوپر کی مثال میں ہمیں دو ایسے دلائل ملے ہیں: myMethod میں arg اور مین میتھڈ میں args۔

کلاس لیول کا دائرہ کار

کلاس لیول اسکوپ (انسٹینس ویری ایبلز) - کلاس میں اعلان کردہ کوئی بھی متغیر اس کلاس کے تمام طریقوں کے لیے دستیاب ہے۔ اس تک رسائی کے ترمیم کار (یعنی عوامی یا نجی) پر منحصر ہے، اس تک کبھی کبھی کلاس سے باہر بھی رسائی حاصل کی جا سکتی ہے۔ لہذا اگر ایک متغیر کلاس متغیر ہے، تو یہ ایک مخصوص آبجیکٹ کا پابند ہے اور اس وقت تک موجود ہے جب تک کہ اس کلاس کی کوئی چیز موجود ہو۔ اگر کوئی اعتراض نہیں ہے، تو متغیر کی کوئی کاپی نہیں ہے. متغیر کلاس کے تمام طریقوں سے نظر آتا ہے، قطع نظر اس سے پہلے کہ ان کا اعلان کیا گیا ہو یا بعد میں۔ ہر آبجیکٹ کا اپنا متغیر ہوتا ہے جو دیگر اشیاء سے آزاد ہوتا ہے۔ جامد طریقوں سے متغیر تک رسائی ممکن نہیں ہے۔

کوڈ کی مثال


public class Student {
   
//class level variables
   public String surname;
   String name;
   String secondName;
   private Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

   @Override
   public int hashCode(){
       //TODO: check for nulls
       //return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());
       return (surname + name + secondName + birthday).hashCode();
   }
   @Override
   public boolean equals(Object other_) {
       Student other = (Student)other_;
       return (surname == null || surname.equals(other.surname) )
               && (name == null || name.equals(other.name))
               && (secondName == null || secondName.equals(other.secondName))
               && (birthday == null || birthday.equals(other.birthday));
   }
}
کنیت ، نام ، دوسرا نام اور سالگرہ مثال کے متغیر ہیں۔

بلاک اسکوپ

اگر متغیر کوڈ کے کسی بلاک میں بیان/اعلان کیا جاتا ہے، تو یہ کوڈ کے اس بلاک کے اختتام تک موجود رہتا ہے۔ عام طور پر، ایسے متغیر گھوبگھرالی منحنی خطوط وحدانی کے درمیان موجود ہوتے ہیں جس میں ان کی تعریف کی گئی ہے۔ اکثر بلاک اسکوپ ایک لوپ متغیر ہوسکتا ہے۔ ایک متغیر جس کا اعلان لوپ کی حالت میں کیا جاتا ہے وہ لوپ سے باہر قابل رسائی نہیں ہے، جب تک کہ آپ اس کی پہلے سے وضاحت نہ کر لیں۔

public class JScopeTest2 {
   public static void main(String[] args) {
       for (int i = 0; i < 10; i++) {
           int sum = 0;
           sum = sum + i;
       }
      
       int sum = 1;
       System.out.println(sum);
   }
}
پہلی رقم اور i دونوں متغیرات لوپ کے اندر ظاہر کیے گئے ہیں اور اس لوپ کے باہر موجود نہیں ہیں۔ تاہم دوسری رقم کو لوپ سے باہر قرار دیا گیا تھا لہذا یہ خاص متغیر پرنٹ ہونے والا ہے۔

جامد متغیرات

اگر کسی متغیر کو جامد قرار دیا جاتا ہے (جسے جامد مطلوبہ الفاظ سے نشان زد کیا جاتا ہے)، تو یہ اس وقت تک موجود رہتا ہے جب تک اس کی کلاس موجود ہو۔ عام طور پر، جب جامد متغیرات کو شروع کیا جاتا ہے تو JVM پہلے استعمال پر ایک کلاس کو میموری میں لوڈ کرتا ہے۔

import java.util.Date;

public class Student {
   public static int today = 2022;
   String surname;
   String name;
   String secondName;
   Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

 
   public static void main(String[] args) {
       System.out.println(today);
   }

}
جامد آج کے متغیر کو استعمال کرنے کے لیے آپ کو اسٹوڈنٹ کلاس کی کوئی نئی مثال نہیں بنانا چاہیے ۔ یہاں "2022" پرنٹ کیا جائے گا۔

ترمیم کرنے والوں تک رسائی

جاوا کے پاس طریقہ یا متغیر تک رسائی کو محدود کرنے کے لیے 4 رسائی میں ترمیم کرنے والے ہیں۔ آپ انہیں کلاسوں کے اندر استعمال کر سکتے ہیں، طریقوں کے اندر نہیں۔
  • نجی سب سے زیادہ پابندی والا ترمیم کنندہ ہے۔ یہ طریقوں اور متغیرات تک رسائی کو اس کلاس تک محدود کرتا ہے جس کا اعلان کیا گیا تھا۔ اگر کلاس سے باہر کچھ طریقوں یا متغیرات کو استعمال کرنے کی ضرورت نہیں ہے تو، نجی استعمال کریں۔ کلاس متغیر جاوا میں عام طور پر نجی ہوتے ہیں۔

  • اگر کوئی رسائی موڈیفائر متعین نہیں کیا گیا ہے، تو طریقہ یا متغیر ڈیفالٹ موڈیفائر کو قبول کرے گا۔ ڈیفالٹ صرف موجودہ پیکیج سے رسائی کی اجازت دیتا ہے۔

  • محفوظ شدہ ترمیم کار کسی طریقہ یا متغیر تک رسائی کی اجازت صرف موجودہ پیکج کے اندر سے دیتا ہے، جب تک کہ اس تک رسائی پیکج کے باہر چائلڈ کلاس کے ذریعے نہ کی جائے۔

  • عوام سب سے کم پابندی والا ترمیم کنندہ ہے۔ یہ آپ کو ایک کلاس، طریقہ یا متغیر تک رسائی حاصل کرنے کی اجازت دیتا ہے نہ صرف کلاس سے، بلکہ باہر سے بھی۔ یہ ترمیم کار واقعی اکثر استعمال ہوتا ہے۔

تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION