Perbedaan antara kelas Abstact dan antarmuka
- Kelas abstrak versus antarmuka di Java 8
- Perbedaan Konseptual:
Metode Default Antarmuka di Java 8
- Apa itu Metode Default?
- Kesalahan kompilasi metode ForEach diselesaikan menggunakan Metode Default
- Metode Default dan Beberapa Masalah Ambiguitas Warisan
- Poin penting tentang metode default antarmuka java:
Metode Statis Antarmuka Java
- Metode Antarmuka Java Interface, contoh kode, metode statis vs metode standar
- Poin penting tentang metode statis antarmuka java:
Antarmuka Fungsional Java
Kelas abstrak versus antarmuka di Java 8
Java 8 perubahan antarmuka termasuk metode statis dan metode default di antarmuka. Sebelum Java 8, kita hanya bisa menggunakan deklarasi metode di antarmuka. Tetapi dari Java 8, kita dapat memiliki metode default dan metode statis di antarmuka.
Setelah memperkenalkan Metode Default, tampaknya antarmuka dan kelas abstrak sama. Namun, konsep mereka masih berbeda di Jawa 8.
Kelas abstrak dapat mendefinisikan konstruktor. Mereka lebih terstruktur dan dapat memiliki keadaan yang terkait dengannya. Sebaliknya, metode default hanya dapat diimplementasikan dalam hal memanggil metode antarmuka lainnya, tanpa referensi ke kondisi implementasi tertentu. Oleh karena itu, keduanya digunakan untuk tujuan yang berbeda dan memilih di antara keduanya benar-benar tergantung pada konteks skenario.
Perbedaan Konseptual:
Kelas abstrak berlaku untuk implementasi skeletal (yaitu parsial) dari antarmuka tetapi tidak boleh ada tanpa antarmuka yang cocok.
Jadi ketika kelas abstrak secara efektif direduksi menjadi visibilitas rendah, implementasi kerangka antarmuka, dapatkah metode standar juga mengambilnya? Jelas: Tidak! Menerapkan antarmuka hampir selalu membutuhkan beberapa atau semua alat pembangun kelas yang kurang dimiliki metode standar. Dan jika beberapa antarmuka tidak, itu jelas merupakan kasus khusus, yang seharusnya tidak membuat Anda tersesat.
Metode Default Antarmuka di Java 8
Java 8 memperkenalkan " Metode Default " atau (metode Defender) fitur baru, yang memungkinkan pengembang untuk menambahkan metode baru ke Antarmuka tanpa merusak implementasi Antarmuka yang ada. Ini memberikan fleksibilitas untuk memungkinkan Interface mendefinisikan implementasi yang akan digunakan sebagai default dalam situasi di mana Kelas konkret gagal menyediakan implementasi untuk metode itu.
Mari kita perhatikan contoh kecil untuk memahami cara kerjanya:
public interface OldInterface {
public void existingMethod();
default public void newDefaultMethod() {
System.out.println("New default method"
+ " is added in interface");
}
}
Kelas berikut akan berhasil dikompilasi di Java JDK 8,
public class OldInterfaceImpl implements OldInterface {
public void existingMethod() {
// existing implementation is here…
}
}
Jika Anda membuat instance dari OldInterfaceImpl:
OldInterfaceImpl obj = new OldInterfaceImpl ();
// print “New default method add in interface”
obj.newDefaultMethod();
Metode default tidak pernah final, tidak dapat disinkronkan dan tidak bisa menimpa metode Object. Mereka selalu bersifat publik, yang sangat membatasi kemampuan untuk menulis metode pendek dan dapat digunakan kembali.
Metode default dapat diberikan ke Antarmuka tanpa memengaruhi Kelas implementasi karena mencakup implementasi. Jika setiap metode ditambahkan dalam Interface yang didefinisikan dengan implementasi maka tidak ada Kelas pelaksana yang terpengaruh. Kelas pelaksana dapat mengganti implementasi default yang disediakan oleh Antarmuka.
Metode default memungkinkan untuk menambahkan fungsionalitas baru ke Antarmuka yang ada tanpa melanggar implementasi yang lebih lama dari Antarmuka ini.
Saat kami memperluas antarmuka yang berisi metode default, kami dapat melakukan yang berikut,
- Tidak mengganti metode default dan akan mewarisi metode default.
- Timpa metode default yang serupa dengan metode lain yang kami timpa dalam subkelas.
- Redeclare metode default sebagai abstrak, yang memaksa subclass untuk menimpanya.
Kesalahan kompilasi metode ForEach diselesaikan menggunakan Metode Default
Untuk Java 8, koleksi JDK telah diperluas dan metode forEach ditambahkan ke seluruh koleksi (yang bekerja bersama dengan lambdas). Dengan cara konvensional, kode tersebut terlihat seperti di bawah ini,
public interface Iterable<T> {
public void forEach(Consumer<? super T> consumer);
}
Karena hasil ini setiap Kelas pelaksana dengan kesalahan kompilasi, metode default ditambahkan dengan implementasi yang diperlukan agar implementasi yang ada tidak boleh diubah.
Antarmuka Iterable dengan metode Default di bawah ini,
public interface Iterable<T> {
public default void forEach(Consumer
<? super T> consumer) {
for (T t : this) {
consumer.accept(t);
}
}
}
Mekanisme yang sama telah digunakan untuk menambahkan Stream di Antarmuka JDK tanpa melanggar Kelas pelaksana.
Metode Default dan Beberapa Masalah Ambiguitas Warisan
Karena Kelas java dapat mengimplementasikan beberapa Antarmuka dan setiap Antarmuka dapat menentukan metode default dengan metode tanda tangan yang sama, oleh karena itu, metode yang diwariskan dapat saling bertentangan.
Pertimbangkan contoh di bawah ini,
public interface InterfaceA {
default void defaultMethod(){
System.out.println("Interface A default method");
}
}
public interface InterfaceB {
default void defaultMethod(){
System.out.println("Interface B default method");
}
}
public class Impl implements InterfaceA, InterfaceB {
}
Kode di atas akan gagal dikompilasi dengan kesalahan berikut,
java: class Impl mewarisi default yang tidak terkait untuk defaultMethod () dari jenis InterfaceA dan InterfaceB
Untuk memperbaiki kelas ini, kita perlu menyediakan implementasi metode default:
public class Impl implements InterfaceA, InterfaceB {
public void defaultMethod(){
}
}
Lebih lanjut, jika kita ingin menjalankan implementasi default yang disediakan oleh salah satu Antarmuka super daripada implementasi kita sendiri, kita dapat melakukannya sebagai berikut,
public class Impl implements InterfaceA, InterfaceB {
public void defaultMethod(){
// existing code here..
InterfaceA.super.defaultMethod();
}
}
Kami dapat memilih implementasi default atau keduanya sebagai bagian dari metode baru kami.
Poin penting tentang metode default antarmuka java:
- Metode default antarmuka Java akan membantu kami dalam memperluas antarmuka tanpa takut merusak kelas implementasi.
- Metode standar antarmuka Java telah menjembatani perbedaan antara antarmuka dan kelas abstrak.
- Metode standar antarmuka Java 8 akan membantu kita menghindari kelas utilitas, seperti semua metode kelas Koleksi dapat disediakan di antarmuka itu sendiri.
- Metode standar antarmuka Java akan membantu kami dalam menghapus kelas implementasi dasar, kami dapat memberikan implementasi standar dan kelas implementasi dapat memilih mana yang akan ditimpa.
- Salah satu alasan utama untuk memperkenalkan metode default di antarmuka adalah untuk meningkatkan API Koleksi di Jawa 8 untuk mendukung ekspresi lambda.
- Jika ada kelas dalam hierarki memiliki metode dengan tanda tangan yang sama, maka metode standar menjadi tidak relevan. Metode default tidak dapat menggantikan metode dari java.lang.Object. Alasannya sangat sederhana, itu karena Object adalah kelas dasar untuk semua kelas java. Jadi, bahkan jika kita memiliki metode kelas Objek didefinisikan sebagai metode default di antarmuka, itu akan sia-sia karena metode kelas Objek akan selalu digunakan. Itu sebabnya untuk menghindari kebingungan, kita tidak dapat memiliki metode default yang menimpa metode kelas Objek.
- Metode default antarmuka Java juga disebut sebagai Metode Defender atau metode ekstensi Virtual.
Tautan Sumber Daya:
- Antarmuka dengan metode default vs kelas Abstrak di Java 8
- Kelas abstrak versus antarmuka di era JDK 8
- Evolusi antarmuka melalui metode ekstensi virtual
Metode Statis Antarmuka Java
Metode Antarmuka Java Interface, contoh kode, metode statis vs metode standar
Metode statis antarmuka Java mirip dengan metode default kecuali bahwa kita tidak bisa menimpanya di kelas implementasi. Fitur ini membantu kita menghindari hasil yang tidak diinginkan jika implementasi buruk di kelas implementasi. Mari kita lihat ini dengan contoh sederhana.
public interface MyData {
default void print(String str) {
if (!isNull(str))
System.out.println("MyData Print::" + str);
}
static boolean isNull(String str) {
System.out.println("Interface Null Check");
return str == null ? true : "".equals(str) ? true : false;
}
}
Sekarang mari kita lihat kelas implementasi yang memiliki metode isNull () dengan implementasi yang buruk.
public class MyDataImpl implements MyData {
public boolean isNull(String str) {
System.out.println("Impl Null Check");
return str == null ? true : false;
}
public static void main(String args[]){
MyDataImpl obj = new MyDataImpl();
obj.print("");
obj.isNull("abc");
}
}
Perhatikan bahwa isNull (String str) adalah metode kelas sederhana, itu tidak mengesampingkan metode antarmuka. Sebagai contoh, jika kita akan menambahkan anotasi @Override ke metode isNull (), itu akan menghasilkan kesalahan kompiler.
Sekarang ketika kita akan menjalankan aplikasi, kita mendapatkan output berikut.
Antarmuka Null Check
Impl Null Check
Jika kita membuat metode antarmuka dari statis ke default, kita akan mendapatkan output berikut.
Impl Null Check
MyData Print ::
Impl Null Check
Metode statis antarmuka Java hanya dapat dilihat oleh metode antarmuka, jika kita menghapus metode isNull () dari kelas MyDataImpl, kita tidak akan dapat menggunakannya untuk objek MyDataImpl. Namun seperti metode statis lainnya, kita dapat menggunakan metode statis antarmuka menggunakan nama kelas. Misalnya, pernyataan yang valid adalah:
boolean result = MyData.isNull("abc");
Poin penting tentang metode statis antarmuka java:
- Metode statis antarmuka Java adalah bagian dari antarmuka, kita tidak dapat menggunakannya untuk objek implementasi kelas.
- Metode statis antarmuka Java baik untuk menyediakan metode utilitas, misalnya cek kosong, penyortiran koleksi, dll.
- Metode statis antarmuka Java membantu kami menyediakan keamanan dengan tidak mengizinkan kelas implementasi menimpa mereka.
- Kita tidak dapat mendefinisikan metode statis antarmuka untuk metode kelas Objek, kita akan mendapatkan kesalahan kompiler sebagai "Metode statis ini tidak dapat menyembunyikan metode contoh dari Objek". Ini karena itu tidak diizinkan di java, karena Object adalah kelas dasar untuk semua kelas dan kita tidak dapat memiliki satu metode statis tingkat kelas dan metode contoh lain dengan tanda tangan yang sama.
- Kita dapat menggunakan metode statis antarmuka java untuk menghapus kelas utilitas seperti Koleksi dan memindahkan semua metode statis itu ke antarmuka yang sesuai, yang akan mudah ditemukan dan digunakan.
Antarmuka Fungsional Java
Sebelum saya menyimpulkan posting, saya ingin memberikan pengantar singkat untuk antarmuka Fungsional. Antarmuka dengan tepat satu metode abstrak dikenal sebagai Antarmuka Fungsional.
Anotasi baru @FunctionalInterface
telah diperkenalkan untuk menandai antarmuka sebagai Antarmuka Fungsional. @FunctionalInterface
anotasi adalah fasilitas untuk menghindari penambahan metode abstrak yang tidak disengaja dalam antarmuka fungsional. Ini opsional tetapi praktik yang baik untuk menggunakannya.
Antarmuka fungsional sudah lama ditunggu dan banyak dicari fitur Java 8 karena memungkinkan kita untuk menggunakan ekspresi lambda untuk instantiate mereka. Paket java.util.function baru dengan banyak antarmuka fungsional ditambahkan untuk menyediakan tipe target untuk ekspresi lambda dan referensi metode. Kami akan melihat antarmuka fungsional dan ekspresi lambda di posting mendatang.
Lokasi Sumber Daya:
- Java 8 Interface Changes - metode statis, metode standar