Antarmuka di Java mirip dengan kelas, tetapi tubuh antarmuka hanya dapat menyertakan metode dan
final
bidang abstrak (konstanta).
Baru-baru ini, saya melihat sebuah pertanyaan, yang terlihat seperti ini
interface AnInterface {
public default void myMethod() {
System.out.println("D");
}
}
Menurut definisi antarmuka, hanya metode abstrak yang diperbolehkan. Mengapa memungkinkan saya untuk mengkompilasi kode di atas? Apa default
kata kuncinya?
Di sisi lain, ketika saya mencoba menulis kode di bawah ini, maka dikatakan modifier default not allowed here
default class MyClass{
}
dari pada
class MyClass {
}
Adakah yang bisa memberi tahu saya tujuan dari default
kata kunci tersebut? Apakah hanya diperbolehkan di dalam antarmuka? Apa bedanya dengan default
(tanpa pengubah akses)?
Jawaban:
Ini adalah fitur baru di Java 8 yang memungkinkan
interface
untuk menyediakan implementasi. Dijelaskan di Java 8 JLS-13.5.6. Deklarasi Metode Antarmuka yang berbunyi (sebagian)Yang Baru di JDK 8 mengatakan (sebagian)
sumber
private
metode.private
metode sebenarnya bukan bagian dari antarmuka, tetapi dapat berfungsi sebagai metode pembantu untukdefault
implementasi atau dalam penginisialisasi konstan. Perhatikan bahwa mereka sudah ada di Java 8, karena, saat Anda menggunakan ekspresi lambda dalam antarmuka,private
metode sintetis akan dibuat. Jadi Java 9 memungkinkan Anda menggunakan fitur itu untuk penggunaan non-sintetis, non lambda juga…Metode default ditambahkan ke Java 8 terutama untuk mendukung ekspresi lambda. Para desainer (secara cerdik, dalam pandangan saya) memutuskan untuk membuat sintaks lambdas untuk membuat implementasi antarmuka tanpa nama. Tetapi mengingat lambda hanya dapat mengimplementasikan satu metode, mereka akan dibatasi pada antarmuka dengan metode tunggal yang akan menjadi batasan yang cukup parah. Sebaliknya, metode default ditambahkan untuk memungkinkan antarmuka yang lebih kompleks digunakan.
Jika Anda perlu meyakinkan klaim yang
default
diperkenalkan karena lambda, perhatikan bahwa proposal manusia jerami Proyek Lambda, oleh Mark Reinhold, pada tahun 2009, menyebutkan 'Metode ekstensi' sebagai fitur wajib yang akan ditambahkan untuk mendukung lambda.Berikut adalah contoh yang mendemonstrasikan konsep tersebut:
interface Operator { int operate(int n); default int inverse(int n) { return -operate(n); } } public int applyInverse(int n, Operator operator) { return operator.inverse(n); } applyInverse(3, n -> n * n + 7);
Sangat dibuat-buat saya menyadari tetapi harus menggambarkan bagaimana
default
mendukung lambda. Karenainverse
merupakan default, ia dapat dengan mudah diganti oleh kelas pelaksana jika diperlukan.sumber
Konsep baru diperkenalkan di Java 8 yang disebut metode default. Metode default adalah metode yang memiliki beberapa implementasi default dan membantu dalam mengembangkan antarmuka tanpa merusak kode yang ada. Mari kita lihat contohnya:
public interface SimpleInterface { public void doSomeWork(); //A default method in the interface created using "default" keyword default public void doSomeOtherWork(){ System.out.println("DoSomeOtherWork implementation in the interface"); } } class SimpleInterfaceImpl implements SimpleInterface{ @Override public void doSomeWork() { System.out.println("Do Some Work implementation in the class"); } /* * Not required to override to provide an implementation * for doSomeOtherWork. */ public static void main(String[] args) { SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl(); simpObj.doSomeWork(); simpObj.doSomeOtherWork(); } }
dan hasilnya adalah:
Do Some Work implementasi di kelas
DoSomeOtherWork implementasi di antarmuka
sumber
Sesuatu yang terlewatkan dalam jawaban lain adalah perannya dalam anotasi. Sejauh Java 1.5,
default
kata kunci muncul sebagai sarana untuk memberikan nilai default untuk bidang anotasi.@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Processor { String value() default "AMD"; }
Penggunaannya kelebihan beban dengan diperkenalkannya Java 8 untuk memungkinkan seseorang menentukan metode default dalam antarmuka.
Hal lain yang terlewatkan: alasan deklarasi
default class MyClass {}
tersebut tidak valid adalah karena cara kelas dideklarasikan sama sekali . Tidak ada ketentuan dalam bahasa yang memungkinkan kata kunci tersebut muncul di sana. Itu memang muncul untuk deklarasi metode antarmuka .sumber
Fitur baru Java 8 ( Metode Default ) memungkinkan sebuah antarmuka menyediakan implementasi ketika diberi label dengan
default
kata kunci.Sebagai contoh:
interface Test { default double getAvg(int avg) { return avg; } } class Tester implements Test{ //compiles just fine }
Uji Antarmuka menggunakan kata kunci default yang memungkinkan antarmuka menyediakan implementasi default metode tanpa perlu menerapkan metode tersebut di kelas yang menggunakan antarmuka.
Kompatibilitas terbalik: Bayangkan antarmuka Anda diimplementasikan oleh ratusan kelas, mengubah antarmuka itu akan memaksa semua pengguna untuk mengimplementasikan metode yang baru ditambahkan, meskipun itu tidak penting untuk banyak kelas lain yang mengimplementasikan antarmuka Anda.
Fakta & Batasan:
1-Mei hanya dideklarasikan dalam antarmuka dan tidak dalam kelas atau kelas abstrak.
2-Harus menyediakan tubuh
3-Ini tidak dianggap publik atau abstrak seperti metode normal lainnya yang digunakan dalam sebuah antarmuka.
sumber
Metode default di antarmuka memungkinkan kita menambahkan fungsionalitas baru tanpa merusak kode lama.
Sebelum Java 8, jika metode baru ditambahkan ke antarmuka, maka semua kelas implementasi antarmuka itu terikat untuk mengganti metode baru itu, bahkan jika mereka tidak menggunakan fungsionalitas baru.
Dengan Java 8, kita bisa menambahkan implementasi default untuk metode baru dengan menggunakan
default
kata kunci sebelum implementasi metode.Bahkan dengan kelas anonim atau antarmuka fungsional, jika kita melihat bahwa beberapa kode dapat digunakan kembali dan kita tidak ingin mendefinisikan logika yang sama di mana pun dalam kode, kita dapat menulis implementasi default dari kode tersebut dan menggunakannya kembali.
Contoh
public interface YourInterface { public void doSomeWork(); //A default method in the interface created using "default" keyword default public void doSomeOtherWork(){ System.out.println("DoSomeOtherWork implementation in the interface"); } } class SimpleInterfaceImpl implements YourInterface{ /* * Not required to override to provide an implementation * for doSomeOtherWork. */ @Override public void doSomeWork() { System.out.println("Do Some Work implementation in the class"); } /* * Main method */ public static void main(String[] args) { SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl(); simpObj.doSomeWork(); simpObj.doSomeOtherWork(); } }
sumber
Penjelasan yang sangat bagus ditemukan di The Java ™ Tutorials , bagian dari penjelasannya adalah sebagai berikut:
Pertimbangkan contoh yang melibatkan produsen mobil yang dikendalikan komputer yang menerbitkan antarmuka standar industri yang menjelaskan metode mana yang dapat digunakan untuk mengoperasikan mobil mereka. Bagaimana jika produsen mobil yang dikendalikan komputer tersebut menambahkan fungsi baru, seperti penerbangan, ke mobil mereka? Pabrikan ini perlu menentukan metode baru untuk memungkinkan perusahaan lain (seperti pabrikan instrumen panduan elektronik) untuk menyesuaikan perangkat lunak mereka dengan mobil terbang. Di mana produsen mobil ini akan mengumumkan metode terkait penerbangan baru ini? Jika mereka menambahkannya ke antarmuka aslinya, maka programmer yang telah mengimplementasikan antarmuka tersebut harus menulis ulang implementasinya. Jika mereka menambahkannya sebagai metode statis, maka programmer akan menganggapnya sebagai metode utilitas, bukan metode inti yang esensial.
Metode default memungkinkan Anda menambahkan fungsionalitas baru ke antarmuka pustaka Anda dan memastikan kompatibilitas biner dengan kode yang ditulis untuk versi lama antarmuka tersebut.
sumber
Metode default memungkinkan Anda menambahkan fungsionalitas baru ke antarmuka aplikasi Anda. Ini juga dapat digunakan untuk memiliki multi warisan . Selain metode default, Anda dapat menentukan metode statis di antarmuka. Ini memudahkan Anda untuk mengatur metode pembantu
sumber