Apa metode defaultnya?
Setelah Java 8 dirilis, metode baru dapat ditambahkan ke antarmuka, tetapi antarmuka masih dapat kompatibel dengan kelas implementasinya. Ini sangat penting karena perpustakaan kelas yang Anda kembangkan dapat banyak digunakan oleh banyak pengembang. Sebelum Java 8, setelah antarmuka dirilis di perpustakaan kelas, jika metode baru ditambahkan ke antarmuka, aplikasi yang mengimplementasikan antarmuka ini akan berisiko mogok menggunakan versi baru antarmuka.
Dengan Java 8, bukankah tidak ada bahaya seperti itu? Jawabannya adalah tidak.
Menambahkan metode default ke antarmuka dapat membuat beberapa kelas implementasi tidak tersedia.
Pertama, mari kita lihat detail metode default.
Dalam Java 8, metode dalam antarmuka dapat diimplementasikan (metode statis di Java 8 juga dapat diimplementasikan dalam antarmuka, tetapi ini adalah topik lain). Metode yang diimplementasikan dalam antarmuka disebut metode default, yang diidentifikasi oleh kata kunci default sebagai pengubah. Ketika suatu kelas mengimplementasikan antarmuka, ia dapat mengimplementasikan metode yang telah diimplementasikan dalam antarmuka, tetapi ini tidak perlu. Kelas ini akan mewarisi metode default. Inilah sebabnya ketika antarmuka berubah, kelas implementasi tidak perlu diubah.
Bagaimana dengan waktu untuk mewarisi lebih banyak?
Segalanya menjadi rumit ketika kelas mengimplementasikan lebih dari satu (misalnya, dua) antarmuka dan antarmuka ini memiliki metode default yang sama. Metode default mana yang diwariskan kelas? Tak satu pun dari mereka! Dalam hal ini, kelas harus mengimplementasikan metode default (hanya) dengan sendirinya (secara langsung atau mewarisi kelas tingkat yang lebih tinggi pada pohon).
Hal yang sama berlaku ketika satu antarmuka mengimplementasikan metode default dan antarmuka lainnya menyatakan metode default sebagai abstrak. Java 8 mencoba untuk menghindari hal -hal yang tidak jelas dan tetap ketat. Jika metode dinyatakan dalam beberapa antarmuka, maka setiap implementasi default tidak akan diwarisi dan Anda akan mendapatkan kesalahan waktu kompilasi.
Namun, jika Anda telah menyusun kelas Anda, tidak akan ada kesalahan kompilasi waktu. Pada titik ini, Java 8 tidak konsisten. Ia memiliki alasannya sendiri, karena berbagai alasan. Saya tidak ingin menjelaskan secara rinci atau mendiskusikannya secara mendalam di sini (karena: Versi telah dirilis dan diskusi sudah terlalu lama, dan platform ini tidak pernah membahasnya seperti ini).
Kelas dapat berjalan secara normal dalam kasus di atas. Namun, itu tidak dapat dikompilasi ulang dengan antarmuka yang dimodifikasi, tetapi masih dapat berjalan dengan antarmuka lama. Berikutnya
Ketika kedua antarmuka memberikan implementasi default ke metode yang sama, metode ini tidak dapat dipanggil kecuali kelas implementasi juga mengimplementasikan metode default (baik secara langsung mengimplementasikannya atau mewarisi kelas tingkat yang lebih tinggi pada pohon untuk implementasi).
Namun, kelas ini kompatibel. Ini dapat dimuat dengan antarmuka baru, atau bahkan dieksekusi, asalkan tidak memanggil metode yang memiliki implementasi default di kedua antarmuka.
Kode contoh
Untuk menunjukkan contoh di atas, saya membuat direktori tes untuk C.Java, yang memiliki 3 subdirektori di bawah ini, yang digunakan untuk menyimpan i1.java dan i2.java. Direktori tes berisi kode sumber C.Java dari Kelas C. Direktori dasar berisi antarmuka ke versi yang dapat dikompilasi dan dijalankan. I1 berisi metode m () yang diimplementasikan secara default, dan I2 tidak berisi metode apa pun.
Kelas implementasi berisi metode utama, sehingga kami dapat menjalankannya dalam pengujian. Ini akan memeriksa apakah ada parameter baris perintah, sehingga kami dapat dengan mudah menjalankan tes yang memanggil m () dan tidak memanggil m ().
Public Class C mengimplementasikan I1, I2 {public static void main (string [] args) {c c = new c (); if (args.length == 0) {cm (); }}} antarmuka publik I1 {default void m () {System.out.println ("Hello Interface 1"); }} antarmuka publik I2 {}Gunakan baris perintah berikut untuk mengkompilasi dan menjalankan:
javac -cp .: base c.javajava -cp .: base chello interface 1
Direktori yang kompatibel berisi antarmuka I2 dengan metode abstrak m () dan antarmuka I1 yang tidak dimodifikasi.
antarmuka publik i2 {void m ();}Ini tidak dapat digunakan untuk mengkompilasi kelas C:
javac -cp .: kompatibel c.javac.java:1: Kesalahan: c tidak abstrak dan tidak mengganti metode abstrak m () di I2Public Class C mengimplementasikan I1, I2 { ^ 1 KesalahanPesan kesalahan sangat akurat. Karena kami memiliki C.Class yang diperoleh dari kompilasi sebelumnya, jika kami mengkompilasi antarmuka di direktori yang kompatibel, kami masih akan mendapatkan dua antarmuka yang dapat menjalankan kelas implementasi:
Javac Compatible/i*.javajava -cp .: Antarmuka Chello yang kompatibel 1
Direktori ketiga disebut salah, dan antarmuka I2 yang terkandung juga mendefinisikan metode m ():
antarmuka publik I2 {default void m () {System.out.println ("Hello Interface 2"); }}Kita seharusnya tidak pernah bosan menyusunnya. Meskipun metode m () didefinisikan dua kali, kelas implementasi masih dapat berjalan selama tidak menyebut metode yang telah didefinisikan beberapa kali, tetapi selama kita menyebut metode m (), itu akan segera gagal. Berikut adalah parameter baris perintah yang kami gunakan:
javac salah/*. javajava -cp .: salah c pengecualian di utas "utama" java.lang.incompatibleClasschangeError: Metode default yang bertentangan: i1.m i2.m di cm (c.java) di c.main (c.java:5) java -cp.
sebagai kesimpulan
Saat Anda port perpustakaan kelas yang menambahkan implementasi default ke antarmuka ke lingkungan Java 8, umumnya tidak akan ada masalah. Setidaknya inilah yang dipikirkan oleh pengembang Perpustakaan Kelas Java8 saat menambahkan metode default ke kelas koleksi. Aplikasi yang menggunakan pustaka kelas Anda masih mengandalkan perpustakaan kelas Java7 tanpa metode default. Saat menggunakan dan memodifikasi beberapa perpustakaan kelas yang berbeda, ada peluang kecil konflik. Bagaimana cara menghindarinya?
Rancang perpustakaan kelas Anda seperti sebelumnya. Jangan menganggapnya enteng ketika Anda dapat mengandalkan metode default. Jangan menggunakannya sebagai benar -benar diperlukan. Pilih nama metode dengan bijak untuk menghindari konflik dengan antarmuka lain. Kami akan belajar cara menggunakan fitur ini untuk pengembangan dalam pemrograman Java.
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.