count
میں فیلڈ مستحکم ہے Counter
، تو اس کا مطلب ہے کہ آپ متغیر کو درج ذیل اظہار کے ساتھ حوالہ دے سکتے ہیں: Counter.count
۔ 
private
فیلڈز صرف اس کلاس کے اندر دستیاب ہیں جس میں ان کا اعلان کیا گیا ہے۔ اور protected
فیلڈز پیکیج کے اندر موجود تمام کلاسوں کے ساتھ ساتھ پیکیج سے باہر ان کے تمام ذیلی طبقات کے لیے دستیاب ہیں۔ فرض کریں کہ Counter
کلاس میں ایک جامد increment()
طریقہ ہے جس کا کام فیلڈ کو بڑھانا ہے count
۔ اس طریقہ کو کال کرنے کے لیے، آپ استعمال کر سکتے ہیں Counter.increment()
۔ Counter
جامد فیلڈ یا طریقہ تک رسائی کے لیے کلاس کی مثال بنانے کی ضرورت نہیں ہے ۔ یہ جامد (کلاس) متغیرات اور طریقوں اور غیر جامد (مثال) متغیرات اور طریقوں کے درمیان بنیادی فرق ہے۔ ایک اہم نوٹ۔ یہ نہ بھولیں کہ کلاس کے جامد اراکین براہ راست کلاس سے تعلق رکھتے ہیں، کلاس کی کسی مثال سے نہیں۔ یعنی جامد متغیر کی قدر تمام اشیاء count
کے لیے یکساں ہوگی ۔ Counter
اس آرٹیکل میں، ہم جاوا میں سٹیٹک موڈیفائر کے استعمال کے بنیادی پہلوؤں کے ساتھ ساتھ کچھ خصوصیات پر غور کریں گے جو آپ کو پروگرامنگ کے کلیدی تصورات کو سمجھنے میں مدد کریں گے۔
جاوا میں جامد ترمیم کنندہ کے بارے میں ہر پروگرامر کو کیا معلوم ہونا چاہئے۔
اس سیکشن میں، ہم جامد طریقوں، فیلڈز اور کلاسز کے استعمال کے اہم پہلوؤں کو دیکھتے ہیں۔ آئیے متغیرات سے شروع کرتے ہیں۔-
آپ جامد سیاق و سباق، جیسے کہ جامد طریقہ یا بلاک کے اندر کسی کلاس کے غیر جامد اراکین تک رسائی حاصل نہیں کر سکتے۔ ذیل میں کوڈ کو مرتب کرنے کے نتیجے میں ایک غلطی ہوگی:
public class Counter { private int count; public static void main(String args []) { System.out.println(count); // Compile time error } }
یہ جاوا پروگرامرز کی طرف سے کی جانے والی سب سے عام غلطیوں میں سے ایک ہے، خاص طور پر نئے آنے والے۔ چونکہ
main
طریقہ جامد ہے اورcount
متغیر نہیں ہے، اس لیے طریقہprintln
کے اندر طریقہ استعمال کرنے سےmain
"مرتب وقت کی خرابی" پیدا ہوگی۔ -
مقامی متغیرات کے برعکس، جامد فیلڈز اور طریقے
thread safe
جاوا میں نہیں ہیں۔ عملی طور پر، یہ ملٹی تھریڈ پروگرامنگ میں سیکورٹی کے مسائل کی سب سے زیادہ وجہ ہے۔ اس بات پر غور کرتے ہوئے کہ کلاس کی ہر مثال جامد متغیر کی ایک ہی نقل کا حوالہ دیتی ہے، ایسے متغیر کو کلاس کے ذریعہ محفوظ یا "لاک" کرنے کی ضرورت ہے۔ لہذا، جامد متغیرات کا استعمال کرتے وقت، اس بات کو یقینی بنائیں کہ وہsynchronized
مسائل سے بچنے کے لیے مناسب طریقے سے ہیں جیسے کہrace conditions
۔ -
جامد طریقوں کا ایک عملی فائدہ ہے کہ ہر بار جب آپ انہیں کال کرنا چاہتے ہیں تو کوئی نئی چیز بنانے کی ضرورت نہیں ہے۔ ایک جامد طریقہ کو اس کلاس کے نام کا استعمال کرتے ہوئے کہا جا سکتا ہے جو اس کا اعلان کرتی ہے۔ اس لیے یہ طریقے
factory
طریقوں اورutility
طریقوں کے لیے بہترین ہیں۔ کلاسjava.lang.Math
ایک شاندار مثال ہے: اس کے تقریباً تمام طریقے جامد ہیں۔ جاوا کی یوٹیلیٹی کلاسز کوfinal
اسی وجہ سے نشان زد کیا گیا ہے۔ -
@Override
ایک اور اہم نکتہ یہ ہے کہ آپ ( ) جامد طریقوں کو اوور رائڈ نہیں کر سکتے ۔ اگر آپ ایک میں اس طرح کے طریقہ کا اعلان کرتے ہیںsubclass
، یعنی ایک ہی نام اور دستخط کے ساتھ ایک طریقہ، تو آپ اسےsuperclass
اوور رائیڈ کرنے کے بجائے صرف "چھپاتے" ہیں۔ یہ رجحان کے طور پر جانا جاتا ہےmethod hiding
. اس کا مطلب یہ ہے کہ اگر والدین اور بچے دونوں کلاسوں میں ایک جامد طریقہ کا اعلان کیا جاتا ہے، تو کہا جاتا طریقہ ہمیشہ مرتب وقت پر متغیر قسم پر مبنی ہوگا۔ طریقہ اوور رائیڈنگ کے برعکس، پروگرام کے چلنے پر اس طرح کے طریقوں پر عمل نہیں کیا جائے گا۔ آئیے ایک مثال پر غور کریں:class Vehicle { public static void kmToMiles(int km) { System.out.println("Inside the parent class / static method"); } } class Car extends Vehicle { public static void kmToMiles(int km) { System.out.println("Inside the child class / static method"); } } public class Demo { public static void main(String args []) { Vehicle v = new Car(); v.kmToMiles(10); } }
کنسول آؤٹ پٹ:
پیرنٹ کلاس / جامد طریقہ کے اندر
کوڈ واضح طور پر ظاہر کرتا ہے کہ اس حقیقت کے باوجود کہ آبجیکٹ a ہے
Car
، کلاس میں جامد طریقہ کوVehicle
کہا جاتا ہے، کیونکہ اس طریقہ کو کمپائل کے وقت بلایا گیا تھا۔ اور نوٹ کریں کہ تالیف کی کوئی غلطیاں نہیں تھیں! -
مزید کیا ہے، اعلی درجے کی کلاسوں کے علاوہ، آپ کلاسوں کو جامد قرار دے سکتے ہیں۔ ایسی کلاسوں کو کہا جاتا ہے
nested static classes
۔ وہ بہتر ہم آہنگی فراہم کرنے کے لیے مفید ہیں۔ نیسٹڈ سٹیٹک کلاس کی ایک شاندار مثال ہےHashMap.Entry
، جو کہ اندر موجود ڈیٹا کا ڈھانچہ ہےHashMap
۔ یہ بات قابل غور ہے کہ، اندرونی کلاسز کی طرح، سٹیٹک نیسٹڈ کلاسز کا اعلان ایک علیحدہ .class فائل میں کیا جاتا ہے۔ اس طرح، اگر آپ اپنی مین کلاس میں پانچ نیسٹڈ کلاسز کا اعلان کرتے ہیں، تو آپ کے پاس کلاس ایکسٹینشن کے ساتھ 6 فائلیں ہوں گی۔ ایک اور مثال ہمارا اپنا اعلان ہےComparator
، جیسے کہ کلاسAgeComparator
میں عمر کا موازنہ کرنے والا ( ) ۔Employee
-
جامد ترمیم کنندہ کو ایک جامد بلاک میں بھی بیان کیا جا سکتا ہے، جسے "سٹیٹک انیشیلائزیشن بلاک" کے نام سے جانا جاتا ہے، جو کلاس کے لوڈ ہونے پر عمل میں لایا جاتا ہے۔ اگر آپ اس طرح کے بلاک کا اعلان نہیں کرتے ہیں، تو جاوا تمام جامد فیلڈز کو ایک فہرست میں جمع کرتا ہے اور کلاس لوڈ ہونے پر انہیں شروع کرتا ہے۔ ایک جامد بلاک چیک شدہ مستثنیات کو نہیں پھینک سکتا، لیکن یہ غیر چیک شدہ کو پھینک سکتا ہے۔ اس صورت میں، ایک
ExceptionInInitializerError
واقع ہو جائے گا. عملی طور پر، کوئی بھی استثناء جو جامد فیلڈز کے آغاز کے دوران ہوتا ہے جاوا کے ذریعہ اس غلطی میں لپیٹ دیا جائے گا۔ یہ اس کی سب سے عام وجہ بھی ہےNoClassDefFoundError
، کیوں کہ جب اس کا حوالہ دیا جائے گا تو کلاس میموری میں نہیں ہوگی۔ -
یہ جاننا مفید ہے کہ جامد طریقے کمپائل کے وقت منسلک ہوتے ہیں، ورچوئل یا غیر جامد طریقوں کے لنک کرنے کے برعکس، جو کہ رن ٹائم پر منسلک ہوتے ہیں جب کسی حقیقی چیز پر کال کی جاتی ہے۔ اس کے مطابق، جاوا میں جامد طریقوں کو اوور رائڈ نہیں کیا جا سکتا، کیونکہ پولیمورفزم ان پر رن ٹائم پر لاگو نہیں ہوتا ہے۔ کسی طریقہ کو جامد قرار دیتے وقت اس پر غور کرنے کی ایک اہم حد ہے۔ ایسا کرنا تبھی سمجھ میں آتا ہے جب کسی ذیلی طبقے میں طریقہ کو اوور رائڈ کرنے کی صلاحیت یا ضرورت نہ ہو۔ فیکٹری کے طریقے اور افادیت کے طریقے سٹیٹک موڈیفائر کے صحیح استعمال کی اچھی مثالیں ہیں۔ جوشوا بلوچ نے اپنی کتاب Effective Java میں متعدد فوائد کی نشاندہی کی ہے جو جامد فیکٹری کے طریقوں کے کنسٹرکٹرز سے زیادہ ہیں، جو ہر جاوا پروگرامر کے لیے لازمی پڑھنا ہے۔
-
ابتداء ایک جامد بلاک کا ایک اہم پہلو ہے۔ کلاس کے میموری میں لوڈ ہونے کے بعد جامد فیلڈز یا متغیرات شروع کیے جاتے ہیں۔ ابتدا کی ترتیب اوپر سے نیچے تک اسی ترتیب میں ہے جس میں جاوا کلاس کی سورس فائل میں ان کا اعلان کیا گیا ہے۔ چونکہ جامد فیلڈز کو تھریڈ سیف طریقے سے شروع کیا جاتا ہے، اس لیے اس عمل کو
Singleton
پیٹرن کو لاگو کرنے کے لیے بھی استعمال کیا جاتا ہے۔ اگر آپ کسی وجہ سےEnum
بطور استعمال نہیں کر رہے ہیںSingleton
، تو آپ کے پاس ایک اچھا متبادل ہے۔ لیکن اس معاملے میں، آپ کو اس بات کا خیال رکھنا چاہیے کہ یہ ایک "سست" ابتدا نہیں ہے۔ اس کا مطلب یہ ہے کہ جامد فیلڈ کو شروع کیا جائے گا یہاں تک کہ اس سے پہلے کہ کوئی اس کے "پوچھے"۔ اگر کوئی چیز وسائل سے بھری ہوئی ہے یا شاذ و نادر ہی استعمال ہوتی ہے، تو اسے جامد بلاک میں شروع کرنا آپ کے حق میں کام نہیں کرے گا۔ -
سیریلائزیشن کے دوران، جامد فیلڈز، جیسے
transient
متغیر، کو سیریلائز نہیں کیا جاتا ہے۔ درحقیقت، اگر آپ کسی بھی ڈیٹا کو جامد فیلڈ میں محفوظ کرتے ہیں، تو اس میں ڈی سیریلائزیشن کے بعد اس کی ابتدائی (ڈیفالٹ) قدر ہوگی۔ مثال کے طور پر، اگر ایک جامد فیلڈ ایک ہےint
، تو ڈیسیریلائزیشن کے بعد اس کی قدر صفر ہوگی۔ اگر اس کی قسم ہے توfloat
، قدر 0.0 ہوگی۔ اگر فیلڈ ایک ہےObject
تو، قدر ہوگیnull
۔ سچ پوچھیں تو یہ جاوا پوزیشنز کے لیے انٹرویوز میں سیریلائزیشن کے بارے میں اکثر پوچھے جانے والے سوالات میں سے ایک ہے۔ ایک مستحکم فیلڈ میں ضروری آبجیکٹ ڈیٹا کو ذخیرہ نہ کریں! -
آخر میں، آئیے جامد درآمد کے بارے میں بات کرتے ہیں۔ اس ترمیم کار میں معیاری بیان کے ساتھ بہت کچھ مشترک ہے
import
، لیکن یہ اس لحاظ سے مختلف ہے کہ یہ آپ کو ایک یا تمام جامد کلاس ممبران کو درآمد کرنے دیتا ہے۔ ایک بار جامد طریقوں کو درآمد کرنے کے بعد، ان تک رسائی حاصل کی جاسکتی ہے جیسے کہ وہ ایک ہی کلاس میں اعلان کیے گئے ہیں. اسی طرح، جامد فیلڈز درآمد کرکے، ہم کلاس کا نام بتائے بغیر ان تک رسائی حاصل کرسکتے ہیں۔ یہ خصوصیت Java 1.5 میں نمودار ہوئی ہے اور صحیح طریقے سے استعمال ہونے پر کوڈ پڑھنے کی اہلیت کو بہتر بناتی ہے۔ یہ کنسٹرکٹ اکثر JUnit ٹیسٹوں میں پایا جاتا ہے، کیونکہ تقریباً تمام ٹیسٹ ڈویلپرز assert کے طریقوں کے لیے static import کا استعمال کرتے ہیں، مثلاًassertEquals()
اور ان کی اوورلوڈ شدہ مختلف حالتیں۔ -
ابھی کے لیے اتنا ہی ہے۔ ہر جاوا پروگرامر کو مذکورہ سٹیٹک موڈیفائر کے تمام پہلوؤں کو جاننے کی ضرورت ہے۔ اس مضمون نے جامد متغیرات، فیلڈز، طریقوں، ابتدائی بلاکس، اور درآمدات کے بارے میں بنیادی معلومات کا جائزہ لیا۔ اس نے کچھ اہم خصوصیات کو بھی چھوا جو جاوا پروگراموں کو لکھنے اور سمجھنے کے لیے جاننا ضروری ہیں۔ مجھے امید ہے کہ ہر ڈویلپر جامد اراکین کے اپنے ہنر مندانہ استعمال کو مکمل کرے گا، کیونکہ یہ سنجیدہ سافٹ ویئر ڈویلپمنٹ کے لیے بہت ضروری ہے۔"
GO TO FULL VERSION