Piter Werhasyň 2014-nji ýylyň aprelinde ýazan makalasynyň terjimesi . Terjimeç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ň.
- abstrakt m () usuly bilen interfeýsi üýtgediň we deslapky ýerine ýetiriş goşuň.
- Üýtgedilen interfeýsi düzüň.
- Işletmek synpy: ýalňyşlyk.
Mysal kody
Aboveokardakylary 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 barmain
, ş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$
GO TO FULL VERSION