JavaRush /Java Blog /Random-TK /Java-da interfeýsler

Java-da interfeýsler

Toparda çap edildi
Salam! Bu gün Java-da möhüm düşünje - interfeýsler barada gürleşeris. Bu söz size tanyş bolsa gerek. Mysal üçin, kompýuter programmalarynyň we oýunlarynyň köpüsinde interfeýsler bar. Giň manyda, interfeýs iki tarapy biri-biri bilen täsirleşýän “uzakdan dolandyrmak” görnüşidir. Gündelik durmuşdan interfeýsiň ýönekeý mysaly, telewizoryň uzakdan dolandyrylmagy. Iki adamy, bir adamy we telewizory birleşdirýär we dürli işleri ýerine ýetirýär: sesiňi açmak ýa-da peseltmek, kanallary üýtgetmek, telewizory açmak ýa-da öçürmek. Hereketi ýerine ýetirmek üçin bir tarapa (adam) interfeýse girmeli (uzakdan dolandyryş düwmesine basyň). Mysal üçin, telewizoryň kanaly indiki kanala geçirmegi üçin. Bu ýagdaýda ulanyja telewizoryň enjamyny we kanaly üýtgetmek prosesiniň içinde nähili amala aşyrylýandygyny bilmek zerurlygy ýok. Java-da näme üçin interfeýsler gerek - 1Ulanyjynyň ähli ygtyýary interfeýsdir . Esasy wezipe islenýän netijäni almakdyr. Munuň programmirleme we Java bilen näme baglanyşygy bar? Göni :) Interfeýs döretmek adaty synp döretmek bilen gaty meňzeýär, ýöne sözüň ýerine söz classkesgitleýäris interface. Iň ýönekeý Java interfeýsine seredeliň we onuň nähili işleýändigini we nämä mätäçdigini kesgitläliň:
public interface Swimmable  {

     public void swim();
}
Swimüzüp bilýänSwimmable interfeýs döretdik . Bu, uzakdan dolandyrmak ýaly bir zat, onuň bir "düwmesi" bar: usul "ýüzmek". Bu “ uzakdan dolandyrmagy ” nädip ulanyp bileris ? Bu maksat bilen usul, ýagny uzakdan dolandyrmakdaky düwmäni durmuşa geçirmeli. Interfeýsi ulanmak üçin onuň usullary programmamyzyň käbir synplary tarapyndan durmuşa geçirilmelidir. Geliň, obýektleri “ýüzüp bilýär” beýanyna laýyk gelýän synp tapalyň. Mysal üçin, ördek synpy amatly : swim()Duck
public class Duck implements Swimmable {

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

    public static void main(String[] args) {

        Duck duck = new Duck();
        duck.swim();
    }
}
Bu ýerde näme görýäris? Bir synp açar söz ulanyp Duckinterfeýs bilen baglanyşyklydyr . Rememberadyňyzda bolsa, mirasy iki synpy birleşdirmek üçin şuňa meňzeş mehanizm ulanýardyk, diňe “ uzaldyldy ” sözi bardy. " " Açyklyk üçin göni manyda terjime edilip bilner: "jemgyýetçilik synpy interfeýsi amala aşyrýar ." Bu, interfeýs bilen baglanyşykly synpyň ähli usullaryny durmuşa geçirmelidigini aňladýar. Üns beriň: synpymyzda, edil interfeýsdäki ýaly , bir usul bar we içinde haýsydyr bir logika bar. Bu hökmany talap. Justaňy “” ýazan bolsak we synpda bir usul döretmedik bolsak , düzüji bize ýalňyşlyk bererdi: Ördek abstrakt däl we ýüzmekde abstrakt usulda ýüzmek () -ni ýok etmeýär Näme üçin beýle bolýar? Thealňyşlygy telewizoryň mysaly bilen düşündirsek, kanallary üýtgetmegi bilmeýän telewizordan “üýtgetmek kanaly” düwmesi bilen adama uzakdan dolandyryş berýändigimiz ýüze çykýar. Bu pursatda düwmäni isleýşiňiz ýaly basyň, hiç zat işlemez. Uzakdan dolandyrmagyň özi kanallary üýtgetmeýär: diňe telewizora signal berýär, içinde kanaly üýtgetmek çylşyrymly prosesi amala aşyrylýar. Ördekimiz bilenem şeýle: interfeýs arkaly girip bolar ýaly ýüzmegi başarmaly . Muny nädip etmelidigini bilmese, interfeýs iki tarapy - adamy we programmany birleşdirmez. Adam programmanyň içindäki bir zady ýüzmek üçin usul ulanyp bilmez . Indi interfeýsleriň nämedigini has aýdyň gördüňiz. Interfeýs, şol interfeýsi durmuşa geçirýän synplaryň bolmaly häsiýetini suratlandyrýar. “Özüňi alyp baryş” usullaryň ýygyndysydyr. Birnäçe habarçy döretmek islesek, muny amala aşyrmagyň iň aňsat usuly interfeýs döretmekdir . Islendik habarçy näme edip biler? Aönekeýleşdirilen görnüşde habar alyň we iberiň. Swimmableimplementspublic class Duck implements SwimmableDuckSwimmableDuckSwimmableswim()public class Duck implements Swimmableswim()DuckSwimmableSwimmableswim()DuckMessenger
public interface Messenger{

     public void sendMessage();

     public void getMessage();
}
Indi bolsa bu interfeýsi durmuşa geçirip, habarçy synplarymyzy döredip bileris. Düzüjiniň özi olary sapaklaryň içinde durmuşa geçirmäge “mejbur eder”. Telegramma:
public class Telegram implements Messenger {

    public void sendMessage() {

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

     public void getMessage() {
         System.out.println("Reading the message in Telegram!");
     }
}
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!");
     }
}
Viber:
public class Viber implements Messenger {

    public void sendMessage() {

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

     public void getMessage() {
         System.out.println("Reading a message in Viber!");
     }
}
Bu nähili peýdalary berýär? Olaryň iň möhümi boş birleşmekdir. Müşderi maglumatlaryny ýygnajak programma düzýändigimizi göz öňüne getiriň. Synpda Clientmüşderiniň haýsy habarçyny ulanýandygyny görkezýän meýdan bolmaly. Interfeýs bolmasa geň görüner:
public class Client {

    private WhatsApp whatsApp;
    private Telegram telegram;
    private Viber viber;
}
Üç meýdan döretdik, ýöne bir müşderiniň aňsatlyk bilen diňe bir habarçysy bolup biler. Diňe haýsysyny bilemzok. Müşderi bilen aragatnaşyk saklamazlyk üçin, mümkin bolan ähli wariantlary klasa “iteklemeli”. Görnüşi ýaly, olaryň biri ýa-da ikisi elmydama şol ýerde bolar nullwe programmanyň işlemegi üçin asla zerurlyk ýok. Munuň ýerine interfeýsimizi ulanmak has gowudyr:
public class Client {

    private Messenger messenger;
}
Bu "boş birleşmegiň" mysaly! Synpda belli bir habarçy synpyny görkezmegiň ýerine Client, müşderiniň habarçysynyň bardygyny belläp geçýäris. Maksatnamanyň dowamynda haýsysy kesgitlener. Whyöne munuň üçin näme üçin interfeýs gerek? Näme üçin asla dile goşuldylar? Sorag gowy we dogry! Şol bir netijäni adaty miras ulanyp gazanyp bolar, şeýlemi? Bu synp Messengerene-atalar synpydyr Viberwe Telegrammirasdüşerlerdir WhatsApp. Hakykatdanam, muny etmek mümkin. Oneöne bir tutmak bar. Öňden bilşiňiz ýaly, Java-da köp miras ýok. Interöne interfeýsleriň birnäçe ýerine ýetirilişi bar. Bir synp isleýşi ýaly köp interfeýs amala aşyryp biler. Meýdançamyz bar - smartfonda gurlan programma bar diýip göz öňüne Smartphonegetiriň Application.
public class Smartphone {

    private Application application;
}
Programma we habarçy, elbetde, meňzeş, ýöne şonda-da başga zatlar. Messenger ykjam we iş stoly bolup biler, Programma bolsa ykjam programma. TelegramŞeýlelik bilen, miras ulansak, synpa bir zat goşup bilmezdik Smartphone. Galyberse-de, bir synp miras Telegramalyp bilmez ! Ondan eýýäm miras almagy we bu görnüşdäki synpa goşmagy başardyk . Emma bir synp iki interfeýsi aňsatlyk bilen amala aşyryp biler! Şonuň üçin bir synpda bir obýekti , bir synpda bolşy ýaly durmuşa geçirip bileris . Ine, bu nähili edildi: ApplicationMessengerMessengerClientTelegramClientTelegramMessengerSmartphoneApplication
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();
    }
}
Indi synpy Telegramisleýşimiz ýaly ulanyp bileris. ApplicationBir ýerde , rolda bir ýerde rol alar Messenger. Interfeýslerdäki usullaryň elmydama “boş”, ýagny durmuşa geçirilmeýändigini eýýäm gören bolsaňyz gerek. Munuň sebäbi ýönekeý: interfeýs özüni alyp barşyny däl-de, özüni alyp barşyny suratlandyrýar. "Interfeýsi amala aşyrýan synplaryň ähli obýektleri Swimmableýüzüp bilmeli": interfeýsiň hemmesi bize aýdýar. FishBalyk, ördek ýa-da at nädip ýüzer , Ducksapaklar üçin Horseinterfeýs üçin däl-de, sorag bar . Kanaly üýtgetmek ýaly, telewizoryň meselesi. Pult, muny ýerine ýetirmek üçin size düwme berýär. Şeýle-de bolsa, Java8-de gyzykly goşundy bar - deslapky usullar. Mysal üçin, interfeýsiňizde 10 usul bar. Olardan 9-sy dürli synplarda başgaça amala aşyrylýar, ýöne biri birmeňzeş ýerine ýetirilýär. Ondan öň, Java8 çykmazdan ozal interfeýsleriň içindäki usullar asla ýerine ýetirilmedi: düzüji derrew ýalňyşlyk goýberdi. Indi muny şeýle edip bilersiňiz:
public interface Swimmable {

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

   public void eat();

   public void run();
}
Açar söz ulanyp default, interfeýsde deslapky ýerine ýetiriş usuly döretdik. Beýleki iki usuly eat()we run()durmuşa geçirjek ähli synplarda özümizi durmuşa geçirmeli bolarys Swimmable. Usul bilen muny etmegiň zerurlygy ýok swim(): durmuşa geçirmek ähli synplarda birmeňzeş bolar. Theeri gelende aýtsak, geçen meselelerde interfeýslere birnäçe gezek duş geldiňiz, özüňizem duýmadyňyz :) Ine, aýdyň mysal: Näme üçin Java-da interfeýsler gerek - 2Interfeýsler bilen işlediňiz Listwe Set! Has takygy, durmuşa geçirilmegi bilen - ArrayListwe LinkedListbaşgalar HashSet. Şol bir diagrammada bir synp birbada birnäçe interfeýs ýerine ýetirilende mysal görkezilýär. Mysal üçin, LinkedListinterfeýsleri Listwe Deque(iki taraplaýyn nobat) amala aşyrýar. MapŞeýle hem , interfeýs bilen has dogrusy, ýerine ýetirilişi bilen tanyş - HashMap. Theeri gelende aýtsak, bu diagrammada bir aýratynlygy görüp bilersiňiz: interfeýsler biri-birinden miras galyp biler. Interfeýs SortedMapnobatdan miras Mapgalypdyr . Interfeýsleriň arasyndaky baglanyşygy görkezmek isleseňiz bu zerur, ýöne bir interfeýs beýlekisiniň giňeldilen görnüşi. Geliň, interfeýs bilen bir meselä seredeliň . Kolleksiýalary entek öwrenip görmedik , ýöne olar gaty ýönekeý we dükanda adaty setir ýaly ýerleşdirilen. Elementleri diňe nobatyň soňuna goşup bilersiňiz we olary diňe başyndan alyp bilersiňiz. Belli bir etapda, elementleri goşmak we iki tarapdan almak üçin nobatçylaryň nobatyň giňeldilen görnüşi gerekdi. Ine, interfeýs döredildi - iki taraplaýyn nobat. Onda yzygiderli nobatyň ähli usullary bar, sebäbi bu iki taraplaýyn nobatyň “ene-atasy”, ýöne täze usullar goşuldy. DequeQueueQueueQueueDeque
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION