JavaRush /Java Blog /Random-TK /Java 8-de deslapky usullar: Näme edip bilýärler we edip b...
Spitfire
Dereje

Java 8-de deslapky usullar: Näme edip bilýärler we edip bilmeýärler?

Toparda çap edildi
Piter Werhasyň 2014-nji ýylyň aprelinde ýazan makalasynyň terjimesi . Java 8-de esasy usullar: Näme edip bilýärler we edip bilmeýärler?  - 1Terjimeçiden: " default usul " adalgasy Java-da ýaňy peýda boldy we munuň üçin rus diline kesgitlenen terjimesiniň bardygyny ýa-da ýokdugyny bilemok. "Adaty usul" adalgasyny ulanaryn, ýöne ideal däl öýdemok. Has üstünlikli terjimesini ara alyp maslahatlaşmaga çagyrýaryn.

Bellenen usul näme?

Indi “Java 8” -iň çykmagy bilen, interfeýs ony durmuşa geçirýän synplar bilen sazlaşykly bolar ýaly täze usullary goşup bilersiňiz. Kiýewden Nýu-Yorkorka çenli köp programmist tarapyndan ulanylýan kitaphanany ösdürýän bolsaňyz, bu gaty möhümdir. Java 8-den öň, kitaphanada interfeýsi kesgitlän bolsaňyz, interfeýsi işleýän käbir programmalar täzelenende bozuljakdygyna töwekgelçilik etmän, oňa usul goşup bilmersiňiz. Şeýlelik bilen, Java 8-de mundan gorkup bolmazmy? Nook. Interfeýsde deslapky usul goşmak, käbir synplary ulanyp bolmaýar. Ilki bilen deslapky usullar barada gowy zatlara seredeliň. Java 8-de bu usul göni interfeýsde amala aşyrylyp bilner. (Interfeýsdäki statiki usullar indi durmuşa geçirilip bilner, ýöne bu başga bir hekaýa.) Interfeýsde ýerine ýetirilen usula adaty usul diýilýär we adaty açar söz bilen görkezilýär . Bir synp interfeýsi ýerine ýetirýän bolsa, interfeýsde ýerine ýetirilen usullary durmuşa geçirip biler, ýöne talap edilmeýär. Synp ýerine ýetirilişi miras alýar. Şonuň üçin ýerine ýetirýän interfeýsini üýtgedeniňizde synplary üýtgetmek hökman däl.

Birnäçe miras?

Bir synp birden köp (aýdyň, iki) interfeýsi ýerine ýetirse we şol bir deslapky usuly ýerine ýetirse, zatlar has çylşyrymlaşýar. Synp haýsy usuly miras alar? Jogap ýok. Bu ýagdaýda synp usulyň özüni durmuşa geçirmeli (gönüden-göni ýa-da başga bir synpdan miras alyp). Diňe bir interfeýsiň deslapky usuly bar bolsa, beýlekisinde şol bir usul abstrakt bolsa, ýagdaý meňzeýär. Java 8 tertipli bolmaga we düşnüksiz ýagdaýlardan gaça durmaga synanyşýar. Usullar birden köp interfeýsde yglan edilse, hiç hili deslapky ýerine ýetiriş synpdan miras galanok - düzme ýalňyşlygy ýüze çykar. Şeýle-de bolsa, synpyňyz eýýäm düzülen bolsa, düzmek ýalňyşlygy bolmaz. Java 8 bu meselede ýeterlik derejede ygtybarly däl. Munuň ara alyp maslahatlaşmak islemeýän sebäpleri bar (mysal üçin: Java çykarylyşy eýýäm çykdy we ara alyp maslahatlaşmagyň wagty köp geçdi we umuman aýdylanda, bu olar üçin ýer däl).
  • Iki interfeýsiňiz bar diýeliň we bir synp olaryň ikisini hem ýerine ýetirýär.
  • Interfeýsleriň biri m () usulyny ýerine ýetirýär.
  • Allhli interfeýsleri we synpy düzýärsiňiz.
  • Abstrakt usul diýip yglan edip, m () usuly bolmadyk interfeýsi üýtgedýärsiňiz.
  • Diňe üýtgedilen interfeýsi düzýärsiňiz.
  • Sapagy başlaň.
Java 8-de esasy usullar: Näme edip bilýärler we edip bilmeýärler?  - 2Bu ýagdaýda synp işleýär. Täzelenen interfeýsler bilen düzüp bilmersiňiz, ýöne köne wersiýalary bilen düzüldi we şonuň üçin işleýär. Indi
  • abstrakt m () usuly bilen interfeýsi üýtgediň we deslapky ýerine ýetiriş goşuň.
  • Üýtgedilen interfeýsi düzüň.
  • Işletmek synpy: ýalňyşlyk.
Haçan-da bir usulyň deslapky ýerine ýetirilmegini üpjün edýän iki interfeýs bar bolsa, bu usul synpyň özi tarapyndan durmuşa geçirilmese (ýene-de özbaşdak ýa-da başga bir synpdan miras galan) synpda çagyrylyp bilinmez. Java 8-de esasy usullar: Näme edip bilýärler we edip bilmeýärler?  - 3Synp gabat gelýär. Üýtgedilen interfeýs bilen ýükläp bolýar. Hatda iki interfeýsde-de deslapky durmuşa geçirilýän usul diýilýänçä işläp biler.

Mysal kody

Java 8-de esasy usullar: Näme edip bilýärler we edip bilmeýärler?  - 4Aboveokardakylary görkezmek üçin, C.java synpy üçin synag katalogyny we I1.java we I2.java faýllaryndaky interfeýsler üçin 3 sany bukjany döretdim. Synag üçin kök katalogda C.java synpynyň deslapky kody bar. Esasy katalogda ýerine ýetirmek we düzmek üçin interfeýsleriň wersiýasy bar: I1 interfeýsinde deslapky usul m () bar; I2 interfeýsinde entek usul ýok. Synpyň usuly bar main, şonuň üçin synap görmek üçin ýerine ýetirip bileris. Buýruk setiriniň argumentleriniň bardygyny ýa-da ýokdugyny barlaýar, şonuň üçin ony ýa-da jaň etmezden aňsatlyk bilen ýerine ýetirip bileris m().
~/github/test$ cat C.java
public class C implements I1, I2 {
  public static void main(String[] args) {
    C c = new C();
    if( args.length == 0 ){
      c.m();
    }
  }
}
~/github/test$ cat base/I1.java
public interface I1 {
  default void m(){
    System.out.println("hello interface 1");
  }
}
~/github/test$ cat base/I2.java
public interface I2 {
}
Buýruk setirinden synpy düzüp we işledip bilersiňiz.
~/github/test$ javac -cp .:base C.java
~/github/test$ java -cp .:base C
hello interface 1
Gabat gelýän katalogda m () usulynyň abstraktdygyny yglan edýän I2 interfeýsiniň wersiýasy we tehniki sebäplere görä I1.java kodlanmadyk göçürmesi bar.
~/github/test$ cat compatible/I2.java

public interface I2 {
  void m();
}
Şeýle toplumy C synpyny düzmek üçin ulanyp bolmaýar:
~/github/test$ javac -cp .:compatible C.java
C.java:1: error: C is not abstract and does not override abstract method m() in I2
public class C implements I1, I2 {
       ^
1 error
Erroralňyşlyk habary gaty takyk. Şeýle-de bolsa, öňki ýygyndydan C.class bar we interfeýsleri gabat gelýän kataloga jemlesek, synpy dolandyrmak üçin henizem ulanyp boljak iki interfeýs bolar:
~/github/test$ javac compatible/I*.java
~/github/test$ java -cp .:compatible C
hello interface 1
Üçünji katalog - wrong- usuly yglan edýän I2 wersiýasyny öz içine alýar m():
~/github/test$ cat wrong/I2.java
public interface I2 {
  default void m(){
    System.out.println("hello interface 2");
  }
}
Compygyndy hakda alada etmegiňem zerurlygy ýok. Usul iki gezek yglan edilse-de, synp henizem m () usuly çagyrylýança ulanylyp bilner. Munuň üçin buýruk setiriniň argumenti gerek:
~/github/test$ javac wrong/*.java
~/github/test$ java -cp .:wrong C
Exception in thread "main" java.lang.IncompatibleClassChangeError: Conflicting default methods: I1.m I2.m
    at C.m(C.java)
    at C.main(C.java:5)
~/github/test$ java -cp .:wrong C x
~/github/test$

Netije

Kitaphanaňyzy Java 8-e geçireniňizde we adaty usullary goşmak üçin interfeýsleriňizi üýtgedeniňizde, hiç hili kynçylyk çekmersiňiz. Iň bärkisi, Java 8 kitaphanasyny döredijiler, funksiýa goşýarka umyt edýärler. Kitaphanaňyzy ulanýan programmalar henizem Java 7 üçin ulanylýar, bu ýerde deslapky usul ýok. Birnäçe kitaphana bilelikde ulanylsa, gapma-garşylyk ähtimallygy bar. Ondan nädip saklanmaly? Kitaphanaňyzyň API-ni öňküsi ýaly dizaýn ediň. Adaty usullaryň mümkinçiliklerine bil baglap, arkaýyn bolmaň. Olar soňky ýol. Beýleki interfeýsler bilen çaknyşmazlyk üçin atlary üns bilen saýlaň. Bu aýratynlygy ulanyp, Java üçin ösüşiň nähili ösjekdigini göreliň.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION