CodeGym /جاوا بلاگ /Random-SD /اسان کي جاوا ۾ انٽرنيٽ جي ضرورت ڇو آهي
John Squirrels
سطح
San Francisco

اسان کي جاوا ۾ انٽرنيٽ جي ضرورت ڇو آهي

گروپ ۾ شايع ٿيل
سلام اڄ اسان جاوا ۾ هڪ اهم تصور بابت ڳالهائڻ وارا آهيون: انٽرفيس. لفظ شايد توهان کي واقف آهي. مثال طور، اڪثر ڪمپيوٽر پروگرامن ۽ رانديون انٽرفيس آهن. هڪ وسيع معنى ۾، هڪ انٽرفيس هڪ قسم جو 'ريموٽ ڪنٽرول' آهي جيڪو ٻن ڌرين کي ڳنڍي ٿو. روزمره جي زندگيء ۾ انٽرفيس جو هڪ سادي مثال هڪ ٽي وي ريموٽ ڪنٽرول آهي. اهو ٻن شين کي ڳنڍي ٿو - هڪ شخص ۽ هڪ ٽي وي - ۽ مختلف ڪمن کي انجام ڏئي ٿو: حجم کي مٿي يا بند ڪريو، چينل سوئچ ڪريو، ۽ ٽي وي کي آن يا بند ڪريو. ھڪڙي پارٽي (ماڻھو) کي انٽرفيس تائين رسائي ڪرڻ جي ضرورت آھي (ريموٽ ڪنٽرول تي بٽڻ کي دٻايو) ٻي پارٽي کي عمل ڪرڻ لاءِ. مثال طور، ٽي وي کي ايندڙ چينل تي تبديل ڪرڻ لاء. وڌيڪ ڇا آهي، صارف کي ڄاڻڻ جي ضرورت ناهي ته ٽي وي کي ڪيئن منظم ڪيو ويو آهي يا ڪيئن چينل تبديل ڪرڻ واري عمل کي اندروني طور تي لاڳو ڪيو ويندو آهي. استعمال ڪندڙ کي صرف هڪ شيء آهي انٽرفيس تائين رسائي آهي. بنيادي مقصد مطلوب نتيجو حاصل ڪرڻ آهي. ان جو پروگرامنگ ۽ جاوا سان ڇا تعلق آهي؟ هر شي :) هڪ انٽرفيس ٺاهڻ هڪ باقاعده ڪلاس ٺاهڻ جي برابر آهي، پر ان جي بدران لفظ class استعمال ڪندي ، اسان لفظ انٽرفيس کي ظاهر ڪريون ٿا . اچو ته آسان ترين جاوا انٽرفيس کي ڏسو، ڏسو ته اهو ڪيئن ڪم ڪري ٿو، ۽ اسان کي ان جي ضرورت ڇو پوندي:
public interface CanSwim {

     public void swim();
}
اسان هڪ CanSwim انٽرفيس ٺاهيو آهي. اهو ٿورڙو اسان جي ريموٽ ڪنٽرول وانگر آهي، پر هڪ 'بٽن' سان: swim() طريقو. پر اسان هن ريموٽ ڪنٽرولر کي ڪيئن استعمال ڪريون ٿا؟ هن کي ڪرڻ لاء، اسان کي هڪ طريقو لاڳو ڪرڻو پوندو، يعني اسان جو ريموٽ ڪنٽرول بٽڻ. انٽرفيس استعمال ڪرڻ لاءِ، اسان جي پروگرام ۾ ڪجھ طبقن کي ان جا طريقا لاڳو ڪرڻ گهرجن. اچو ته هڪ ڪلاس ايجاد ڪريون جنهن جون شيون ’ترڻ ڪري سگهن‘. مثال طور، هڪ بتھ ڪلاس مناسب آهي:
public class Duck implements CanSwim {

    public void swim() {
        System.out.println("Duck, swim!");
    }

    public static void main(String[] args) {

        Duck duck = new Duck();
        duck.swim();
    }
}
"اسان هتي ڇا ٿا ڏسو؟ Duck class ' conswim interface ' سان لاڳو ڪيل لفظ سان لاڳاپيل آهي . توهان کي ياد هوندو ته اسان وراثت ذريعي ٻن طبقن کي ڳنڍڻ لاءِ ساڳيو ميکانيزم استعمال ڪيو، پر ان صورت ۾ اسان لفظ Extensions استعمال ڪيو. مڪمل وضاحت سان، اسان ترجمو ڪري سگھون ٿا ' پبلڪ ڪلاس ڊڪ امپليڪس CanSwim ' لفظي طور تي: 'عوامي بتھ ڪلاس CanSwim انٽرفيس کي لاڳو ڪري ٿو'. ان جو مطلب اهو آهي ته هڪ انٽرفيس سان لاڳاپيل طبقي کي ان جي سڀني طريقن کي لاڳو ڪرڻ گهرجي. نوٽ: اسان جو Duckڪلاس، جيئن انٽرفيس CanSwimجو هڪ swim()طريقو آهي، ۽ ان ۾ ڪجهه منطق شامل آهي، اها هڪ لازمي گهرج آهي، جيڪڏهن اسان ڪلاس ۾ ميٿڊ public class Duck implements CanSwimٺاهڻ کان سواءِ ئي لکنداسين ، ته ڪمپائلر اسان کي هڪ غلطي ڏيندو: بتھ خلاصي نه آهي ۽ خلاصي طريقي جي سوئم کي اوور رائڊ نٿو ڪري. () CanSwim ۾ ڇو؟ ائين ڇو ٿئي ٿو؟ جيڪڏهن اسان ٽي وي مثال استعمال ڪندي غلطي جي وضاحت ڪريون، اهو ائين ٿيندو جيئن ڪنهن کي ٽي وي ريموٽ ڪنٽرول هٿ ڪرڻ سان 'چينل تبديل ڪريو' جي بٽڻ سان جيڪو چينل تبديل نٿو ڪري سگهي. توهان بٽڻ کي دٻائي سگهو ٿا. جيترو توهان چاهيو، پر اهو ڪم نه ڪندو. ريموٽ ڪنٽرول پاڻ ۾ چينل تبديل نٿو ڪري: اهو صرف ٽي وي ڏانهن سگنل موڪلي ٿو، جيڪو چينل تبديل ڪرڻ جي پيچيده عمل کي لاڳو ڪري ٿو. ۽ پوءِ اھو اسان جي بتھ سان آھي: اھو ضرور ڄاڻڻ گھرجي ته ترڻ ڪيئن آھي تنھنڪري ان کي انٽرفيس استعمال ڪندي سڏيو وڃي ٿو . جيڪڏهن اها خبر ناهي ته ڪيئن، انٽرفيس ٻن پارٽين کي ڳنڍي نه ٿو - شخص ۽ پروگرام. ماڻهو پروگرام جي اندر ترڻ جو طريقو استعمال ڪرڻ جي قابل نه هوندو. هاڻي توهان وڌيڪ واضح طور تي سمجھندا آهيو ته انٽرفيس ڇا آهن. هڪ انٽرفيس ان رويي کي بيان ڪري ٿو جيڪو انٽرفيس کي لاڳو ڪندڙ طبقن کي لازمي هجي. ’رويي‘ طريقن جو مجموعو آهي. جيڪڏهن اسان چاهيون ٿا ته ڪيترائي ميسينجر ٺاهي، سڀ کان آسان ڪم اهو آهي ته هڪ انٽرفيس ٺاهڻ. هر رسول کي ڪهڙي ضرورت آهي؟ بنيادي سطح تي، انهن کي پيغام وصول ڪرڻ ۽ موڪلڻ جي قابل هوندو. swim()DuckCanSwimCanSwimswim()DuckMessenger
public interface Messenger{

     public void sendMessage();

     public void getMessage();
}
ھاڻي اسان صرف پنھنجي ميسينجر ڪلاس ٺاھي سگھون ٿا جيڪي لاڳاپيل انٽرفيس کي لاڳو ڪن. مرتب ڪندڙ پاڻ اسان کي ’مجبور‘ ڪندو ته ان کي اسان جي ڪلاسن ۾ لاڳو ڪري. ٽيليگرام:
public class Telegram implements Messenger {

    public void sendMessage() {

        System.out.println("Sending a Telegram message!");
    }

     public void getMessage() {
         System.out.println("Receiving a Telegram message!");
     }
}
WhatsApp:
public class WhatsApp implements Messenger {

    public void sendMessage() {

        System.out.println("Sending a WhatsApp message!");
    }

     public void getMessage() {
         System.out.println("Reading a WhatsApp message!");
     }
}
وائبر:
public class Viber implements Messenger {

    public void sendMessage() {

        System.out.println("Sending a Viber message!");
    }

     public void getMessage() {
         System.out.println("Receiving a Viber message!");
     }
}
هي ڪهڙو فائدو ڏئي ٿو؟ انهن مان سڀ کان اهم - لوز coupling. تصور ڪريو ته اسان هڪ پروگرام ٺاهي رهيا آهيون جيڪو ڪلائنٽ ڊيٽا گڏ ڪندو. ڪلاس Clientکي يقيني طور تي فيلڊ جي ضرورت آهي انهي کي ظاهر ڪرڻ لاءِ ته ڪلائنٽ ڪهڙو مخصوص ميسينجر استعمال ڪري رهيو آهي. انٽرفيس جي بغير، هي عجيب نظر ايندو:
public class Client {

    private WhatsApp whatsApp;
    private Telegram telegram;
    private Viber viber;
}
اسان ٽي فيلڊ ٺاهيا، پر هڪ ڪلائنٽ صرف هڪ ميسينجر ٿي سگهي ٿو. اسان کي صرف خبر ناهي ته ڪهڙو. تنهنڪري اسان کي ڪلاس ۾ هر ممڪن شامل ڪرڻو پوندو ته جيئن ڪلائنٽ سان رابطو ڪرڻ جي قابل ٿي. اهو ظاهر ٿئي ٿو ته انهن مان هڪ يا ٻه هميشه هوندا null، مڪمل طور تي پروگرام طرفان غير ضروري. ان جي بدران اسان جو انٽرفيس استعمال ڪرڻ بهتر آهي:
public class Client {

    private Messenger messenger;
}
هي آهي لوز ڪپلنگ جو هڪ مثال! ڪلاس ۾ هڪ مخصوص ميسينجر ڪلاس جي وضاحت ڪرڻ بدران Client، اسان صرف اهو ظاهر ڪريون ٿا ته ڪلائنٽ وٽ هڪ ميسينجر آهي. جنهن جو اندازو لڳايو ويندو جڏهن پروگرام هلندي. پر اسان کي ان لاءِ انٽرفيس جي ضرورت ڇو آهي؟ انهن کي به زبان ۾ ڇو شامل ڪيو ويو؟ اھو ھڪڙو سٺو سوال آھي - ۽ صحيح سوال! ڇا اسان عام وراثت استعمال ڪندي ساڳيو نتيجو حاصل نٿا ڪري سگھون؟ ڪلاس Messengerوالدين جي حيثيت ۾، ۽ Viber, Telegram, ۽ WhatsAppٻارن وانگر. درحقيقت، اهو ممڪن آهي. پر اتي هڪ snag آهي. جيئن ته توهان اڳ ۾ ئي ڄاڻو ٿا، جاوا وٽ هڪ کان وڌيڪ وراثت ناهي. پر اتي ڪيترن ئي انٽرفيس لاء حمايت آهي. ھڪڙو ڪلاس لاڳو ڪري سگھي ٿو جيترو توھان چاھيو انٽرفيس. تصور ڪريو ته اسان وٽ ھڪڙو Smartphoneطبقو آھي جنھن ۾ ھڪڙو Appفيلڊ آھي، جيڪو سمارٽ فون تي نصب ٿيل ايپ جي نمائندگي ڪري ٿو.
public class Smartphone {

    private App app;
}
يقينا، هڪ ايپ ۽ هڪ ميسينجر هڪجهڙا آهن، پر اهي اڃا تائين مختلف شيون آهن. ميسينجر جا موبائيل ۽ ڊيسڪ ٽاپ ورجن ٿي سگهن ٿا، پر ايپ خاص طور تي موبائل ايپ جي نمائندگي ڪري ٿي. هتي معاملو آهي - جيڪڏهن اسان وراثت استعمال ڪيو، اسان طبقي Telegram۾ اعتراض شامل ڪرڻ جي قابل نه هوندا Smartphone. سڀ کان پوء، Telegramطبقو هڪ ئي وقت وارث نه ٿو ڪري سگهي App۽ Messenger! ۽ اسان اڳ ۾ ئي ان کي وارث ڪيو Messenger۽ ان کي Clientڪلاس ۾ شامل ڪيو. پر Telegramڪلاس آساني سان ٻنهي انٽرفيس کي لاڳو ڪري سگهي ٿو! ان مطابق، اسان Clientڪلاس کي Telegramهڪ شئي طور ڏئي سگھون ٿا Messenger، ۽ اسين ان کي Smartphoneڪلاس کي ڏئي سگھون ٿا App. هتي آهي توهان اهو ڪيئن ڪريو ٿا:
public class Telegram implements Application, Messenger {

    // ...methods
}

public class Client {

    private Messenger messenger;

    public Client() {
        this.messenger = new Telegram();
    }
}


public class Smartphone {

    private Application application;

    public Smartphone() {
        this.application = new Telegram();
    }
}
هاڻي اسان Telegramڪلاس استعمال ڪري رهيا آهيون جيئن اسان چاهيون ٿا. ڪجهه هنڌن تي، اهو ڪم ڪري ٿو App. ٻين هنڌن تي، اهو ڪم ڪري ٿو Messenger. توهان ضرور اڳ ۾ ئي محسوس ڪيو آهي ته انٽرفيس طريقا هميشه 'خالي' آهن، يعني انهن تي عمل درآمد نه آهي. هن جو سبب سادو آهي: انٽرفيس رويي کي بيان ڪري ٿو، پر اهو ان تي عمل نٿو ڪري. 'سڀ شيون جيڪي CanSwimانٽرفيس کي لاڳو ڪن ٿيون ترڻ جي قابل هجڻ گهرجن': اهو سڀ ڪجهه آهي جيڪو انٽرفيس اسان کي ٻڌائي ٿو. Fishمڇي، بتھ ۽ گھوڙا ترڻ جو مخصوص طريقو ، Duck, ۽ طبقن لاءِ سوال آھي Horse، نه انٽرفيس جو. جيئن چينل کي تبديل ڪرڻ ٽي وي جو ڪم آهي. ريموٽ صرف توهان کي هن لاء هڪ بٽڻ ڏئي ٿو. بهرحال، جاوا 8 ۾ هڪ دلچسپ اضافو ظاهر ٿيو - ڊفالٽ طريقا. مثال طور، توهان جي انٽرفيس ۾ 10 طريقا آهن. انهن مان 9 مختلف طبقن ۾ مختلف لاڳو ڪيا ويا آهن، پر سڀني لاء هڪ ئي لاڳو ڪيو ويو آهي. اڳي، جاوا 8 کان اڳ، انٽرفيس طريقن جو ڪو به عمل نه هو: مرتب ڪندڙ فوري طور تي هڪ غلطي ڏني. هاڻي توهان هن وانگر ڪجهه ڪري سگهو ٿا:
public interface CanSwim {

   public default void swim() {
       System.out.println("Swim!");
   }

   public void eat();

   public void run();
}
لفظ استعمال ڪندي default، اسان ٺاھيو آھي ھڪڙو انٽرفيس طريقو ڊفالٽ عمل سان. اسان کي ٻن ٻين طريقن - eat()۽ run()- سڀني طبقن ۾ جيڪي لاڳو ڪن ٿا، لاء اسان جي پنهنجي عمل درآمد مهيا ڪرڻ جي ضرورت آهي CanSwim. اسان کي هن طريقي سان ڪرڻ جي ضرورت ناهي swim(): عمل درآمد هر طبقي ۾ ساڳيو هوندو. رستي ۾، توهان اڳ ۾ ئي اڳئين ڪمن ۾ انٽرفيس تي اچي چڪا آهيو، جيتوڻيڪ توهان نوٽيس نه ڪيو :) هتي هڪ وشد مثال آهي: توهان ڪم ڪيو آهي ۽ انٽرفيس ڇو جاوا ۾ انٽرفيس ضروري آهن - 2سان ! وڌيڪ واضح طور تي، توهان انهن جي عملن سان ڪم ڪيو آهي - , , , وغيره. ساڳيو ڊراگرام واضح طور تي هڪ مثال ڏئي ٿو جتي هڪ طبقو هڪ ئي وقت ڪيترن ئي انٽرفيس کي لاڳو ڪري ٿو. مثال طور، ۽ (ڊبل ختم ٿيل قطار) انٽرفيس کي لاڳو ڪري ٿو . توهان انٽرفيس سان واقف آهيو، يا بلڪه، ان جي عمل سان. رستي ۾، هي ڊراگرام هڪ خاصيت کي بيان ڪري ٿو: انٽرفيس ٻين انٽرفيس کي وارث ڪري سگھن ٿا. انٽرفيس ورثي ۾ ملي ٿو ، جڏهن ته ورثي ۾ . اهو ضروري آهي جيڪڏهن توهان انٽرفيس جي وچ ۾ لاڳاپو ڏيکارڻ چاهيو ٿا، جتي هڪ انٽرفيس ٻئي جو وڌايل نسخو آهي. اچو ته انٽرفيس سان هڪ مثال تي غور ڪريو. اسان اڃا تائين نظرثاني نه ڪئي آهي ، پر اهو بلڪل سادو آهي ۽ ڪم ڪري ٿو هڪ عام قطار وانگر، يا لائن، دڪان تي. توھان صرف شيون شامل ڪري سگھوٿا قطار جي آخر ۾، ۽ صرف انھن کي شروعات کان وٺي سگھو ٿا. ڪجهه نقطي تي، ڊولپرز کي قطار جي هڪ بهتر ورزن جي ضرورت آهي ته جيئن ٻنهي سرن تي شيون شامل ڪرڻ ۽ وٺڻ لاء. تنهن ڪري انهن هڪ انٽرفيس ٺاهيو ، جيڪو ڊبل ختم ٿيل قطار آهي. ان ۾ هڪ عام قطار جا سڀ طريقا آهن. آخرڪار، اهو ڊبل ختم ٿيل قطار جو والدين آهي، پر اهو پڻ نوان طريقا شامل ڪري ٿو.ListSetArrayListLinkedListHashSetLinkedListListDequeMapHashMapSortedMapMapDequeQueueQueueQueuesDeque
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION