JavaRush /Blog Jawa /Random-JV /Metode Default ing Jawa 8: Apa sing Bisa lan Ora Bisa?
Spitfire
tingkat

Metode Default ing Jawa 8: Apa sing Bisa lan Ora Bisa?

Diterbitake ing grup
Terjemahan artikel sing ditulis Peter Verhas tanggal April 2014. Metode Default ing Jawa 8: Apa sing Bisa lan Ora Bisa?  - 1Saka penerjemah: istilah " metode standar " mung muncul ing Jawa lan aku ora yakin manawa ana terjemahan sing mapan ing basa Rusia. Aku bakal nggunakake istilah "metode standar", sanajan aku ora mikir iku becik. Aku ngajak sampeyan ngrembug terjemahan sing luwih sukses.

Apa cara standar

Saiki, kanthi release Java 8, sampeyan bisa nambah cara anyar kanggo antarmuka supaya antarmuka tetep kompatibel karo kelas sing ngleksanakake. Iki penting banget yen sampeyan ngembangake perpustakaan sing digunakake dening akeh programer saka Kyiv nganti New York. Sadurunge Java 8, yen sampeyan nemtokake antarmuka ing perpustakaan, sampeyan ora bisa nambah metode kasebut tanpa resiko yen sawetara aplikasi sing mbukak antarmuka bakal rusak nalika dianyari. Dadi, ing Jawa 8 sampeyan ora bisa wedi maneh? Ora sampeyan ora bisa. Nambahake metode standar menyang antarmuka bisa nggawe sawetara kelas ora bisa digunakake. Pisanan ayo goleki sing apik babagan metode standar. Ing Jawa 8, cara kasebut bisa ditindakake langsung ing antarmuka. (Cara statis ing antarmuka saiki bisa uga dileksanakake, nanging iki crita liyane.) Cara sing diimplementasikake ing antarmuka diarani metode standar, lan dilambangake karo tembung kunci standar . Yen kelas ngleksanakake antarmuka, bisa, nanging ora dibutuhake, ngleksanakake cara sing dileksanakake ing antarmuka. Kelas kasebut menehi implementasine standar. Mulane ora perlu ngowahi kelas nalika ngganti antarmuka sing ditindakake.

Multiple warisan?

Iku dadi luwih rumit yen kelas ngleksanakake luwih saka siji (ngomong, loro) antarmuka, lan padha ngleksanakake cara standar padha. Cara apa sing bakal diwarisake kelas? Jawabane ora ana. Ing kasus iki, kelas kudu ngleksanakake cara dhewe (salah siji langsung utawa dening warisan saka kelas liyane). Kahanan padha yen mung siji antarmuka duwe cara standar, lan ing liyane cara padha abstrak. Jawa 8 nyoba kanggo disiplin lan nyingkiri kahanan sing ora jelas. Yen cara diumumake ing luwih saka siji antarmuka, mula ora ana implementasine standar sing diwarisake dening kelas - sampeyan bakal entuk kesalahan kompilasi. Sanajan, sampeyan bisa uga ora entuk kesalahan kompilasi yen kelas sampeyan wis dikompilasi. Jawa 8 ora cukup kuwat babagan iki. Ana alasan kanggo iki, sing aku ora pengin ngrembug (contone: release Jawa wis dirilis lan wektu kanggo diskusi wis suwe liwati lan umume, iki dudu papan kanggo wong-wong mau).
  • Contone, sampeyan duwe rong antarmuka lan kelas ngetrapake loro-lorone.
  • Salah sawijining antarmuka ngleksanakake cara standar m ().
  • Sampeyan ngumpulake kabeh antarmuka lan kelas.
  • Sampeyan ngganti antarmuka sing ora duwe metode m () kanthi nyatakake minangka cara abstrak.
  • Sampeyan mung ngumpulake antarmuka sing diowahi.
  • Miwiti kelas.
Metode Default ing Jawa 8: Apa sing Bisa lan Ora Bisa?  - 2Ing kasus iki kelas dianggo. Sampeyan ora bisa ngumpulake karo antarmuka sing dianyari, nanging dikompilasi karo versi lawas lan mulane bisa digunakake. Saiki
  • ngganti antarmuka nganggo metode m abstrak () lan nambah implementasine standar.
  • Kompilasi antarmuka sing diowahi.
  • Run kelas: kesalahan.
Nalika ana loro antarmuka sing nyedhiyani implementasine standar saka cara, cara sing ora bisa disebut ing kelas kajaba iku dipun ginakaken dening kelas dhewe (maneh, salah siji dhewe utawa dipun warisaken saka kelas liyane). Metode Default ing Jawa 8: Apa sing Bisa lan Ora Bisa Ditindakake?  - 3Kompatibel kelas. Bisa dimuat karo antarmuka sing diowahi. Bisa uga mlaku nganti metode diarani sing duwe implementasine standar ing loro antarmuka.

Tuladha kode

Metode Default ing Jawa 8: Apa sing Bisa lan Ora Bisa?  - 4Kanggo nduduhake ndhuwur, Aku digawe direktori test kanggo kelas C.java lan 3 subdirektori kanggo antarmuka ing file I1.java lan I2.java. Direktori ROOT kanggo test ngandhut kode sumber kanggo kelas C.java. Direktori dasar ngemot versi antarmuka sing cocog kanggo eksekusi lan kompilasi: antarmuka I1 nduweni cara standar m (); Antarmuka I2 durung duwe cara apa wae. Kelas kasebut duwe metode mainsupaya bisa dieksekusi kanggo nyoba. Priksa manawa ana argumen baris perintah, supaya kita bisa nindakake kanthi gampang nganggo utawa tanpa nelpon 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 {
}
Sampeyan bisa ngumpulake lan mbukak kelas saka baris printah.
~/github/test$ javac -cp .:base C.java
~/github/test$ java -cp .:base C
hello interface 1
Direktori kompatibel ngemot versi antarmuka I2 sing mratelakaken m () cara abstrak, lan uga, kanggo alasan technical, salinan unmodified saka I1.java.
~/github/test$ cat compatible/I2.java

public interface I2 {
  void m();
}
Set kasebut ora bisa digunakake kanggo ngumpulake kelas C:
~/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
Pesen kesalahan akurat banget. Nanging, kita duwe C.class saka kompilasi sadurungé lan, yen kita ngumpulake antarmuka menyang direktori kompatibel, kita bakal duwe loro antarmuka sing isih bisa digunakake kanggo mbukak kelas:
~/github/test$ javac compatible/I*.java
~/github/test$ java -cp .:compatible C
hello interface 1
Direktori katelu - wrong- ngemot versi I2, sing uga nyatakake cara m():
~/github/test$ cat wrong/I2.java
public interface I2 {
  default void m(){
    System.out.println("hello interface 2");
  }
}
Sampeyan ora kudu kuwatir babagan kompilasi. Sanajan cara kasebut diumumake kaping pindho, kelas kasebut isih bisa digunakake lan mbukak nganti metode m () diarani. Iki sing kita butuhake argumen baris perintah:
~/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$

Kesimpulan

Nalika port perpustakaan kanggo Java 8 lan ngganti antarmuka kanggo kalebu cara gawan, sampeyan mbokmenawa ora duwe masalah. Paling ora, sing dikarepake pangembang perpustakaan Java 8 nalika nambah fungsionalitas. Aplikasi sing nggunakake perpustakaan sampeyan isih digunakake kanggo Java 7, sing ora ana metode standar. Yen sawetara perpustakaan digunakake bebarengan, ana kamungkinan konflik. Kepiye cara supaya ora? Desain API perpustakaan sampeyan kanthi cara sing padha kaya sadurunge. Aja dadi puas kanthi ngandelake kemampuan metode standar. Dheweke minangka pilihan pungkasan. Pilih jeneng kanthi ati-ati supaya ora tabrakan karo antarmuka liyane. Ayo ndeleng kepiye pangembangan Jawa nggunakake fitur iki bakal berkembang.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION