JavaRush /جاوا بلاگ /Random-SD /ڪافي بريڪ #165. جاوا ۾ پيڪيجز. شروعاتي لاءِ ٿريڊ-محفوظ طر...

ڪافي بريڪ #165. جاوا ۾ پيڪيجز. شروعاتي لاءِ ٿريڊ-محفوظ طريقا

گروپ ۾ شايع ٿيل

جاوا پيڪيجز

ذريعو: Usemynotes هي پوسٽ توهان کي جاوا ۾ پيڪيجز کي بهتر سمجهڻ، انهن جي مقصد کي سمجهڻ ۽ انهن کي ڪيئن لاڳو ڪرڻ ۾ مدد ڪندي. ڪافي بريڪ #165.  جاوا ۾ پيڪيجز.  شروعاتي لاءِ ٿريڊ محفوظ طريقا - 1

جاوا ۾ پيڪيجز ڇا آهن

جاوا ۾ ھڪڙو پيڪيج ھڪڙو طريقو آھي ھڪڙي گروپ کي گڏ ڪرڻ جو ھڪڙو گروپ ڪلاس، انٽرفيس، ۽ ذيلي پيڪيجز. پيڪيجز لاڳاپيل طبقن جا گروپ ٺاهڻ لاءِ استعمال ڪيا ويندا آهن، انٽرفيس، ڳڻپ، وغيره. ذيلي پيڪيجز اهي پيڪيجز آهن جيڪي ٻئي پيڪيج جي اندر آهن. اهي ڊفالٽ طور درآمد نه ڪيا ويا آهن، پر جيڪڏهن ضروري هجي ته توهان دستي طور تي درآمد ڪري سگهو ٿا. رسائي جي وضاحت هڪ ذيلي پيڪيج جي انفرادي ميمبرن کي فراهم نه ڪئي وئي آهي؛ انهن کي الڳ پيڪيجز طور سمجهيو ويندو آهي.

جاوا ۾ پيڪيجز جا ڪجهه قسم:

  • java.lang - ڊفالٽ طور جاوا سان گڏ اچي ٿو.
  • java.io - ان پٽ/آئوٽ پٽ سان لاڳاپيل ڪلاس، طريقا ۽ ٻيا عنصر شامل آهن.

پيڪيجز جي ضرورت ڇو آهي؟

  • نالي جي تڪرار کان بچڻ لاء.
  • ڪنٽرول رسائي فراهم ڪرڻ لاء.
  • ڊيٽا encapsulation حاصل ڪرڻ لاء.

جاوا ۾ هڪ پيڪيج ڪيئن ٺاهيو؟

اچو ته ڪمپيوٽر نالي هڪ پيڪيج ٺاهيون . عام طور تي پيڪيج جو نالو ننڍن اکرن ۾ لکيو ويندو آهي. اهو صرف طبقاتي نالن سان نالن جي تضاد کان بچڻ لاءِ ڪيو ويو آهي. اسان پلگ ايبل نالي هڪ انٽرفيس پڻ ٺاهينداسين ، جيڪو ڪمپيوٽر پيڪيج ۾ موجود هوندو .
package computer;

interface Pluggable {
   public void pluggedIn();
   public void pluggedOut();
}
هاڻي اسان PenDrive نالي هڪ ڪلاس ٺاهينداسين جيڪو مٿين انٽرفيس کي لاڳو ڪندو.
package computer;

public class PenDrive implements Pluggable {

   int storage = 64;

   public void pluggedIn () {
     System.out.println("Pen Drive is connected");
   }

   public void pluggedOut () {
     System.out.println("Pen Drive is removed");
   }

   public int storage() {
     return storage;
   }

   public static void main(String args[]) {
     PenDrive p = new PenDrive ();
     p.pluggedIn();
     System.out.println("Pen Drive Storage: " + p.storage());
     p.pluggedOut();
   }
}

جاوا ۾ هڪ پيڪيج جي درجه بندي ڪيئن ٺاهيو؟

جڏهن هڪ ترتيب ٺاهيندي، جاوا ۾ پيڪيجز کي ريورس آرڊر ۾ رکيو ويو آهي. اهو انهن کي ڊائريڪٽرن يا فولڊرن سان تمام گهڻو ملندو آهي. بس هڪ ذاتي ڪمپيوٽر تي، جتي هڪ فولڊر هڪ يا وڌيڪ ذيلي فولڊر تي مشتمل ٿي سگهي ٿو، ساڳيو ئي جاوا ۾ پيڪيجز تي لاڳو ٿئي ٿو. اچو ته ڏسو ايشيا.انڊيا.ڪولڪتا نالي هڪ پيڪيج . اهي سڀ موجود فولڊر آهن، پر جيڪڏهن توهان جاگرافيائي بيهڪ تي غور ڪريو، ته اهو واضح ٿئي ٿو ته ڪئالالمپور هندستان ۾ آهي، ۽ هندستان ايشيا ۾ آهي. درجي بندي جو بنيادي مقصد طبقن کي ڳولڻ آسان بڻائڻ آهي.

جاوا ۾ پيڪيجز جا قسم

تعمير ٿيل پيڪيجز

بلٽ ان پيڪيجز اهي پيڪيجز آهن جن ۾ وڏي تعداد ۾ بلٽ ان ڪلاس شامل آهن جيڪي جاوا API جو حصو آهن. انهن پيڪيجز ۾ شامل آهن:
  • java.util - هن پيڪيج ۾ يوٽيلٽي ڪلاسن جو هڪ محدود تعداد شامل آهي جيڪي ڊيٽا جي جوڙجڪ کي لاڳو ڪرڻ لاءِ استعمال ڪيا ويندا آهن جهڙوڪ ڳنڍيل لسٽ، سيٽ وغيره. اهو پڻ سپورٽ ڪري ٿو تاريخ ۽ وقت جي عملن ۽ گهڻو ڪجهه.
  • java.net - اهو نيٽ ورڪ آپريشنز لاءِ استعمال ٿيندڙ ڪلاسن تي مشتمل آهي.

استعمال ڪندڙ بيان ڪيل پيڪيجز

صارف پاران بيان ڪيل پيڪيجز کي صارف پيڪيجز سڏيو ويندو آهي. صارف دستي طور تي ھڪڙو پيڪيج ٺاھي سگھي ٿو ۽ ان ۾ ڪيترائي ڪلاس ھجن جيئن ھو چاھين.

ٻئي پيڪيج مان هڪ پيڪيج تائين ڪيئن رسائي ڪجي؟

توهان ٽن سادي طريقن سان ٻئي پيڪيج مان هڪ پيڪيج تائين رسائي ڪري سگهو ٿا:
  • هڪ وارداتي بيان ۾ ستاري استعمال ڪندي
جاوا ۾ "سڀني شين" جي نمائندگي ڪرڻ لاءِ ستاري ( * ) ڪردار استعمال ڪيو ويندو آهي. ان کي استعمال ڪندي، اسان هر شي کي درآمد ڪري سگھون ٿا جيڪو ھڪڙي پيڪيج جي ذيلي پيڪيج اندر آھي. مثال: اوزار نالي هڪ پيڪيج تي غور ڪريو . جيڪڏهن اسان هر شي کي درآمد ڪرڻ چاهيون ٿا جيڪو هن پيڪيج جي اندر آهي ته پوء اسان کي درآمد واري بيان کي استعمال ڪرڻ جي ضرورت آهي جهڙوڪ:
import tools.*;
  • درآمد package.ClassName استعمال ڪندي؛
هڪ پيڪيج ۾ ڪلاس جي نالي جو ذڪر ڪرڻ هڪ مؤثر طريقو آهي صرف انهن طبقن کي درآمد ڪرڻ جو جيڪو توهان کي پنهنجي پروگرام ۾ گهربل آهي، ان ڪري غير ضروري ڪلاسن کي درآمد ڪرڻ کان پاسو ڪيو. مثال: ڪتاب نالي هڪ پيڪيج تي غور ڪريو . جيڪڏهن اسان صرف ان مان هڪ مخصوص ڪلاس يا انٽرفيس درآمد ڪرڻ چاهيون ٿا (اسان ڏسنداسين صفحا ڪلاس )، ته پوءِ اسان صرف ان کي استعمال ڪندي درآمد ڪري سگهون ٿا:
import book.Pages;
  • توھان جو پورو نالو استعمال ڪندي
هتي هڪ طريقو آهي سڌو سنئون هڪ جاوا پيڪيج يا ان جي طبقن کي استعمال ڪندي انهن جي مڪمل طور تي قابل نالو استعمال ڪندي. انهي طريقي سان توهان کي پيڪيج درآمد ڪرڻ جي ضرورت ناهي ۽ ان کي سڌو سنئون پروگرام ۾ استعمال ڪري سگهو ٿا. مثال:
java.awt.List aSimpleList = new java.awt.List();

جاوا ۾ ڊفالٽ بيچ سائيز

ڊفالٽ طور، Java درآمد ڪري ٿو java.lang پيڪيج . ان ۾ ڪيترائي ڪلاس آھن جيڪي عام طور تي سادو جاوا پروگرامن ۾ استعمال ٿيندا آھن جھڙوڪ String , Integer ۽ ٻيا. سڀ کان اهم طبقن مان هڪ آهي Object ڪلاس، جنهن جي نتيجي ۾ java.lang پيڪيج ۾ پڻ مليو آهي . هن پيڪيج جي ماپ ان جي اجزاء تي ٻڌل آهي: 8 انٽرفيس، 37 ڪلاس، 3 اينيم، 27 استثنا، 23 غلطي جا قسم، ۽ 5 تشريح جا قسم.

شروعاتي لاءِ ٿريڊ-محفوظ جاوا طريقا

ذريعو: وچولي هن آرٽيڪل کي استعمال ڪندي، توهان جاوا ۾ ٿريڊ محفوظ طريقن جي ڪم ڪرڻ بابت سکي سگهو ٿا. ڪافي بريڪ #165.  جاوا ۾ پيڪيجز.  شروعاتي لاءِ ٿريڊ محفوظ طريقا - 2مون ڏٺو آهي ته ڪيترائي جونيئر/مڊل جاوا ڊولپر غلط سمجھن ٿا ته ڪيئن ٿريڊ-سيف طريقا حقيقي منصوبن ۾ ڪم ڪرڻ گهرجن. ۽ جيئن ته اسان عام طور تي گھڻن موضوعن واري ماحول ۾ ڪم ڪندا آهيون، انهن جو صحيح استعمال تمام ضروري آهي. ٿريڊ-محفوظ طريقو ھڪڙو طريقو آھي جيڪو ھڪ ٻئي جي ڊيٽا جي حالت کي متاثر ڪرڻ کان سواءِ ھڪ ئي وقت ڪيترن ئي موضوعن مان سڏي سگھجي ٿو. هن تصور جي اڻپوري سمجهه جي ڪري ڪيڙا آهن جن کي ڳولڻ ۽ درست ڪرڻ ڏکيو آهي. اهڙين غلطين کان بچڻ لاء، اچو ته مثالن کي ڏسو.

مثال نمبر 1:

public static int countLetters(String input) {
    int counter = 0;

    for (Character c : input.toCharArray()) {
        if (Character.isAlphabetic(c)) {
            counter++;
        }
    }

    return counter;
}
  • ڳڻپيوڪر جو طريقو جامد آهي، اهو هڪ int واپس ڪري ٿو ۽ هڪ اسٽرنگ پيٽرولر کي ان پٽ طور قبول ڪري ٿو.
  • طريقي جي اندر هڪ پرائمري ويريبل ڪائونٽر ٺاهيو ويندو آهي، پوءِ لوپ ان پٽ اسٽرنگ جي ڪردارن جي ذريعي لوپ ڪندو آهي ۽ هر دفعي هڪ خط جي ڪردار کي منهن ڏيڻ تي ويريبل ڪائونٽر کي وڌائيندو آهي.
ڇا اهو طريقو محفوظ آهي؟ ڪيترائي ڊولپر چون ٿا نه، ڇاڪاڻ ته هن معاملي ۾ اسان وٽ هڪ واڌارو آپريشن آهي، جيڪو ڌاڳو محفوظ ناهي. اچو ته ان جو اندازو لڳايو. جاوا ميموري ماڊل ۾ اسان وٽ اسٽيڪ ۽ هيپ آهي. هر سلسلي جو پنهنجو اسٽيڪ هوندو آهي، ۽ سڀ سلسلا ساڳيا ڍير شيئر ڪندا آهن. انهي سلسلي ۾، اسٽيڪ ڊيٽا هميشه محفوظ آهي، پر هيپ ڊيٽا ناهي. اسٽيڪ پرائمري ۽ اعتراض جا حوالا محفوظ ڪري ٿو. هيپ پاڻ ۾ شيون شامل آهن. هن جو مطلب اهو آهي ته هن ڪوڊ مثال ۾، هر ٿلهو اسٽيڪ تي پنهنجو متغير ڪائونٽر محفوظ ڪري ٿو ۽ ٻين موضوعن جي ڊيٽا تي ڪو به اثر نٿو پوي، تنهنڪري طريقو محفوظ آهي thread . نوٽ ڪريو ته اسٽرنگ ان پٽ ويليو به هڪ شئي آهي، پر اسٽرنگ ۽ پرائمٽيو ريپرس ( Integer ، Long ، Double ، Boolean ۽ پوءِ) ٿريڊ محفوظ آهن ڇو ته اهي ناقابل تبديلي آهن.

مثال نمبر 2:

public static int countLetters2(String input) {
    List<Character> listCounter = new ArrayList<>();

    for (Character c : input.toCharArray()) {
        if (Character.isAlphabetic(c)) {
            listCounter.add(c);
        }
    }

    return listCounter.size();
}
هي ڪوڊ ساڳيو منطق استعمال ڪيو آهي جيئن پهريون مثال، پر استعمال ڪيو هڪ فهرست اعتراض جي بدران primitive int variable . پوئين حصي مان اسان ڄاڻون ٿا ته جاوا ۾ شيون هيپ ۾ محفوظ ٿيل آهن ۽ فهرست هڪ اعتراض آهي. اسان اهو پڻ ڄاڻون ٿا ته اسٽيڪ اسٽورن جي حوالن کي ڍير تي شين جي حوالي ڪري ٿو. مثال طور #2، هر ٿريڊ هڪ نئون ArrayList اعتراض ٺاهي ٿو : ۽ listCounter variable ان جي شئي جو حوالو ڍير تي رکي ٿو، تنهنڪري ٻيو ڪو به موضوع ان اعتراض کي تبديل نٿو ڪري سگهي.
List<Character> listCounter = new ArrayList<>();
هن جو مطلب آهي ته هي طريقو محفوظ آهي.

مثال نمبر 3:

public class CounterUtil { // singleton

    List<Character> listCounter = new ArrayList<>();

    public int countLetters3(String input) {
        for (Character c : input.toCharArray()) {
            if (Character.isAlphabetic(c)) {
                listCounter.add(c);
            }
        }

        return listCounter.size();
    }
}
هن مثال ۾، اسان وٽ هڪ سنگلٽن آهي (هي اهم آهي) ڪلاس CounterUtil هڪ عالمي متغير فهرست سان Counter . هي متغير هڪ ئي وقت تي ٺهيل آهي سنگلٽن مثال طور. جڏهن گھڻن موضوعن کي سڏين ٿا countChars3 طريقو ، اهي سڀ استعمال ڪندا آهن ساڳيو عالمي متغير listCounter ، جيڪو هڪ ئي شئي جو حوالو ذخيرو ڪري ٿو heap تي، ۽ اتي موجود ٿريڊس هڪ ٻئي تي اثر انداز ٿيندا. تنهن ڪري اسان اهو نتيجو ڪري سگهون ٿا ته هي طريقو محفوظ ناهي. ۽ جيتوڻيڪ جيڪڏهن اسان List<Character> listCounter کي هڪ پرائمري variable int counter ۾ تبديل ڪريون ٿا ، اهو به ٿريڊ محفوظ نه هوندو، ڇاڪاڻ ته سڀئي ٿريڊ ساڳيا پرائمٽيو متغير استعمال ڪندا.

آخري مثال:

public static int countLetters4(List<Character> inputList) {
    List<Character> listCounter = new ArrayList<>();

    for (Character c : inputList) {
        if (Character.isAlphabetic(c)) {
            listCounter.add(c);
        }
    }

    return listCounter.size();
}
CountLetters4 طريقو اسٽرنگ پيراميٽر جي بدران اکرن جي لسٽ قبول ڪري ٿو . هتي اسان ضمانت نٿا ڏئي سگهون ته هي طريقو محفوظ آهي. ڇو؟ ڇو ته اسان يقين نه ٿا ڪري سگهون ته ڊولپر هن طريقي کي ڪيئن استعمال ڪندا. جيڪڏهن ٻاهران ڪو ٻيو ٿريڊ ان پٽ لسٽ ۾ ڊيٽا کي ساڳئي وقت اسان جي counterLetters4 طريقي سان تبديل ڪري ٿو ، اهو حتمي نتيجو متاثر ڪري سگهي ٿو.

نتيجو

اسان صرف چار مثالن تي غور ڪيو آهي، ۽ اهي جاوا پروجيڪٽ ۾ سلسلي جي حفاظت جي سڀني حصن کي نه ڍڪيندا آهن، پر اهي شروع ڪرڻ لاء سٺو جڳهه آهن. ايندڙ وقت توهان پنهنجي ڪوڊ ۾ هڪ طريقو ڏسندا، پاڻ کان پڇو، "ڇا اهو طريقو محفوظ آهي؟" ۽ تمام جلد توهان واضح طور تي جواب سمجھندا.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION