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); } }
ڪنسول آئوٽ:
والدين طبقي جي اندر / جامد طريقو
ڪوڊ واضح طور تي ظاھر ڪري ٿو ته ان حقيقت جي باوجود ته اعتراض ھڪڙو آھي
Car
، ڪلاس ۾ جامد طريقوVehicle
سڏيو ويندو آھي، ڇاڪاڻتہ طريقي سان گڏ وقت سڏيو ويندو ھو. ۽ نوٽ ڪريو ته ڪا به تاليف جي غلطي نه هئي! -
وڌيڪ ڇا آهي، اعلي سطحي طبقن کان سواء، توهان طبقن کي جامد قرار ڏئي سگهو ٿا. اهڙن طبقن کي سڏيو ويندو آهي
nested static classes
. اهي بهتر هم آهنگي مهيا ڪرڻ لاء مفيد آهن. nested جامد طبقي جو هڪ شاندار مثال آهيHashMap.Entry
، جيڪو اندر اندر ڊيٽا جي جوڙجڪ آهيHashMap
. اهو نوٽ ڪرڻ جي قابل آهي ته، اندروني طبقن وانگر، جامد نسٽڊ ڪلاس هڪ الڳ .class فائل ۾ بيان ڪيا ويا آهن. اهڙيءَ طرح، جيڪڏهن توهان پنهنجي مکيه ڪلاس ۾ پنج nested ڪلاسن جو اعلان ڪندا، ته توهان وٽ .class ايڪسٽينشن سان 6 فائلون هونديون. ٻيو مثال اسان جو پنهنجو اعلان آهيComparator
، جيئن ڪلاسAgeComparator
۾ عمر جو مقابلو ڪندڙ ( )Employee
. -
جامد موڊيفائر پڻ هڪ جامد بلاڪ ۾ بيان ڪري سگهجي ٿو، بهتر طور تي "جامد شروعاتي بلاڪ" طور سڃاتو وڃي ٿو، جيڪو عمل ڪيو ويندو آهي جڏهن ڪلاس لوڊ ڪيو ويندو آهي. جيڪڏهن توهان اهڙي بلاڪ جو اعلان نه ڪيو، جاوا سڀني جامد شعبن کي هڪ واحد لسٽ ۾ گڏ ڪري ٿو ۽ انهن کي شروع ڪري ٿو جڏهن ڪلاس لوڊ ٿئي ٿي. هڪ جامد بلاڪ چيڪ ٿيل استثنان کي اڇلائي نٿو سگهي، پر اهو اڻ چيڪ ٿيل اڇلائي سگھي ٿو. هن معاملي ۾، هڪ
ExceptionInInitializerError
ٿيندو. عملي طور تي، ڪنهن به استثنا جيڪو جامد شعبن جي شروعات دوران ٿئي ٿو، جاوا طرفان هن غلطي ۾ لپي ويندا. اهو پڻ سڀ کان وڌيڪ عام سبب آهيNoClassDefFoundError
، ڇاڪاڻ ته ڪلاس ياداشت ۾ نه هوندو جڏهن اهو حوالو ڏنو ويندو. -
اهو ڄاڻڻ ڪارائتو آهي ته جامد طريقا ڪمپائل ٽائيم تي ڳنڍيل هوندا آهن، ورچوئل يا غير جامد طريقن جي ڳنڍڻ جي برعڪس، جيڪي رن ٽائيم تي ڳنڍيل هوندا آهن جڏهن ڪنهن حقيقي شئي کي سڏيو ويندو آهي. ان جي مطابق، جامد طريقن جاوا ۾ ختم نه ٿي ڪري سگھجي، ڇاڪاڻ ته پوليمورفيزم انهن تي رن ٽائم تي لاڳو نٿو ٿئي. هي هڪ اهم حد آهي جنهن تي غور ڪيو وڃي جڏهن هڪ طريقو جامد بيان ڪيو وڃي. ائين ڪرڻ صرف ان وقت سمجھ ۾ اچي ٿو جڏهن ذيلي ڪلاس ۾ طريقي کي ختم ڪرڻ جي صلاحيت يا ضرورت نه آهي. فيڪٽري جا طريقا ۽ افاديت جا طريقا جامد موڊيفائر جي صحيح استعمال جا سٺا مثال آهن. جوشوا بلوچ ڪيترن ئي فائدن جي نشاندهي ڪري ٿو ته جامد ڪارخاني جا طريقا پنهنجي ڪتاب Effective Java ۾ ڪنسٽرڪٽرز کان وڌيڪ آهن، جيڪو هر جاوا پروگرامر لاءِ لازمي پڙهڻ آهي.
-
شروعات هڪ جامد بلاڪ جو هڪ اهم پاسو آهي. جامد شعبن يا متغيرن کي شروعاتي ڪلاس کان پوءِ ميموري ۾ لوڊ ڪيو ويندو آهي. شروعات جو حڪم مٿي کان هيٺ تائين آهي، ساڳئي ترتيب ۾ جنهن ۾ اهي جاوا ڪلاس جي سورس فائل ۾ اعلان ڪيا ويا آهن. جيئن ته جامد شعبن کي ٿريڊ-محفوظ انداز ۾ شروع ڪيو ويو آهي، اهو عمل پڻ
Singleton
نموني کي لاڳو ڪرڻ لاء استعمال ڪيو ويندو آهي. جيڪڏهن توهان ڪجهه سببن جيEnum
طور تي استعمال نه ڪري رهيا آهيوSingleton
، ته توهان وٽ سٺو متبادل آهي. پر هن معاملي ۾، توهان کي اهو سمجهڻ گهرجي ته هي هڪ "سست" شروعات نه آهي. ان جو مطلب اهو آهي ته جامد فيلڊ شروع ڪئي ويندي جيتوڻيڪ ان کان اڳ ڪنهن جي "پڇڻ" کان اڳ. جيڪڏهن ڪا شئي وسيلا تمام گهڻي يا گهٽ ۾ گهٽ استعمال ٿيل آهي، ته پوءِ ان کي جامد بلاڪ ۾ شروع ڪرڻ توهان جي حق ۾ ڪم نه ڪندو. -
سيريلائيزيشن جي دوران، جامد فيلڊ،
transient
متغير وانگر، سيريلائيز نه آهن. درحقيقت، جيڪڏهن توهان ڪنهن به ڊيٽا کي هڪ جامد فيلڊ ۾ محفوظ ڪيو ٿا، اهو ان جي ابتدائي (ڊفالٽ) قيمت تي مشتمل هوندو deserialization کان پوء. مثال طور، جيڪڏهن هڪ جامد فيلڊ هڪ آهيint
، ان جي قيمت ختم ٿيڻ کان پوء صفر ٿي ويندي. جيڪڏھن ان جو قسم آھيfloat
، قدر ھوندو 0.0. جيڪڏهن فيلڊ هڪ آهيObject
، قدر ٿيندوnull
. ايماندار ٿيڻ لاء، هي جاوا پوزيشن لاء انٽرويو ۾ سيريلائيزيشن بابت اڪثر پڇيا ويا سوالن مان هڪ آهي. ضروري اعتراض واري ڊيٽا کي مستحڪم فيلڊ ۾ ذخيرو نه ڪريو! -
آخرڪار، اچو ته جامد درآمد بابت ڳالهايون. هي ترميم ڪندڙ معياري
import
بيان سان تمام گهڻو عام آهي، پر اهو مختلف آهي ته اهو توهان کي هڪ يا سڀني جامد طبقي ميمبرن کي منتقل ڪرڻ جي اجازت ڏئي ٿو. هڪ دفعو جامد طريقا درآمد ڪيا ويا آهن، انهن کي رسائي سگهجي ٿو ڄڻ ته اهي ساڳئي طبقي ۾ اعلان ڪيا ويا آهن. اهڙي طرح، جامد شعبن کي درآمد ڪندي، اسان انهن تائين رسائي ڪري سگهون ٿا بغير ڪنهن طبقي جو نالو بيان ڪرڻ جي. هي خصوصيت جاوا 1.5 ۾ ظاهر ٿيو ۽ ڪوڊ پڙهڻ جي صلاحيت کي بهتر بڻائي ٿو جڏهن صحيح طريقي سان استعمال ڪيو وڃي. هي تعمير گهڻو ڪري JUnit ٽيسٽن ۾ ملي ٿو، ڇاڪاڻ ته لڳ ڀڳ سڀ ٽيسٽ ڊولپر استعمال ڪن ٿا جامد درآمد جي طريقن جي لاءِ، مثال طورassertEquals()
۽ انهن جي اوور لوڊ ٿيل مختلف قسمن. -
اهو سڀ ڪجهه هاڻي لاءِ آهي. هر جاوا پروگرامر کي ڄاڻڻ جي ضرورت آهي ته مٿي ڄاڻايل جامد تبديل ڪندڙ جي سڀني حصن کي. هي آرٽيڪل جامد متغير، فيلڊ، طريقن، شروعاتي بلاڪ، ۽ درآمد بابت بنيادي معلومات جو جائزو ورتو. اهو پڻ ڪجهه اهم ملڪيتن کي ڇڪيو آهي جيڪي جاوا پروگرام لکڻ ۽ سمجهڻ لاء ڄاڻڻ ضروري آهن. مون کي اميد آهي ته هر ڊولپر جامد ميمبرن جي مهارت واري استعمال کي پورو ڪندو، ڇاڪاڻ ته اهو سنجيده سافٽ ويئر ڊولپمينٽ لاء تمام ضروري آهي.
GO TO FULL VERSION