Kelas abstrak versus antarmuka di era JDK 8

Dalam API Tanggal dan Waktu Java 8 yang baru: Wawancara dengan Stephen Colebourne, Stephen Colebourne memberi tahu Hartmut Schlosser, "Menurut saya perubahan bahasa yang paling penting bukanlah lambda, tetapi metode statis dan default pada antarmuka." Colebourne menambahkan, "Penambahan metode default menghilangkan banyak alasan untuk menggunakan kelas abstrak." Saat saya membaca ini, saya menyadari bahwa Colebourne benar dan banyak situasi di mana saya saat ini menggunakan kelas abstrak dapat diganti dengan antarmuka dengan metode default JDK 8. Ini cukup signifikan di dunia Java karena perbedaan antara kelas abstrak dan antarmuka telah menjadi salah satu masalah yang menyusahkan pengembang Java baru yang mencoba memahami perbedaannya. Dalam banyak hal, membedakan keduanya bahkan lebih sulit di JDK 8.

Ada banyak contoh forum dan blog online yang membahas perbedaan antara antarmuka dan kelas abstrak di Java. Ini termasuk, tetapi tidak terbatas pada, kelas Abstrak JavaWorld vs antarmuka, StackOverflow Kapan saya harus menggunakan antarmuka daripada kelas abstrak ?, Perbedaan Antara Antarmuka dan Kelas Abstrak, dan 10 Kelas Abstrak dan Jawaban Pertanyaan Wawancara Antarmuka di Java. Meskipun berguna dan informatif seperti sebelumnya, banyak di antaranya sekarang sudah usang dan mungkin menjadi bagian dari kebingungan yang lebih besar lagi bagi mereka yang baru mengenal Java yang memulai pengalaman Java mereka dengan JDK 8.

Ketika saya memikirkan tentang perbedaan yang tersisa antara antarmuka Java dan kelas abstrak di dunia JDK 8, saya memutuskan untuk melihat apa yang dikatakan Tutorial Java tentang ini. Tutorial telah diperbarui untuk mencerminkan JDK 8 dan Metode dan Kelas Abstrak memiliki bagian yang disebut "Kelas Abstrak Dibandingkan dengan Antarmuka" yang telah diperbarui untuk menggabungkan JDK 8. Bagian ini menunjukkan persamaan dan perbedaan antarmuka JDK 8 dengan kelas abstrak . Perbedaan yang disoroti adalah aksesibilitas anggota data dan metode: kelas abstrak memungkinkan bidang non-statis dan non-final dan memungkinkan metode menjadi publik, pribadi, atau dilindungi sementara bidang antarmuka secara inheren bersifat publik, statis, dan final, dan semuanya metode antarmuka pada dasarnya bersifat publik.

Tutorial Java melanjutkan ke daftar poin untuk kapan kelas abstrak harus dipertimbangkan dan kapan antarmuka harus dipertimbangkan. Tidak mengherankan, ini berasal dari perbedaan yang disebutkan sebelumnya dan terutama berkaitan dengan apakah Anda memerlukan bidang dan metode untuk menjadi pribadi, dilindungi, non-statis, atau tidak final (mendukung kelas abstrak) atau apakah Anda memerlukan kemampuan untuk fokus pada pengetikan tanpa memperhatikan implementasi (mendukung antarmuka).

Karena Java mengizinkan sebuah kelas untuk mengimplementasikan beberapa antarmuka tetapi hanya memperluas satu kelas, antarmuka tersebut mungkin dianggap menguntungkan ketika implementasi tertentu perlu dikaitkan dengan beberapa tipe. Berkat metode default JDK 8, antarmuka ini bahkan dapat menyediakan perilaku default untuk implementasi.

Sebuah pertanyaan alami mungkin adalah, "Bagaimana Java menangani kelas yang mengimplementasikan dua antarmuka, keduanya menjelaskan metode default dengan tanda tangan yang sama?" Jawabannya adalah ini adalah kesalahan kompilasi. Ini diperlihatkan dalam cuplikan layar berikutnya yang menunjukkan NetBeans 8 melaporkan kesalahan ketika kelas saya menerapkan dua antarmuka yang masing-masing mendefinisikan metode default dengan tanda tangan yang sama ( String speak()).

Seperti yang ditunjukkan oleh cuplikan layar, kesalahan kompilator ditampilkan yang menyatakan, "kelas ... mewarisi default yang tidak terkait untuk ... dari tipe ... dan ..." (di mana nama kelas, nama metode default, dan dua nama antarmuka adalah apa pun yang ditentukan dalam pesan). Peter Verhas telah menulis posting rinci ("Metode default Java 8: apa yang bisa dan tidak bisa dilakukan?") Melihat beberapa kasus sudut (gotchas) terkait dengan antarmuka yang diterapkan multiply dengan nama metode default dengan tanda tangan yang sama.

Kesimpulan

JDK 8 bisa dibilang memberikan keuntungan terbesar kelas abstrak atas antarmuka ke antarmuka. Implikasi dari hal ini adalah bahwa sejumlah besar kelas abstrak yang digunakan saat ini kemungkinan besar dapat diganti dan sejumlah besar pekerjaan masa depan yang dulunya merupakan kelas abstrak sekarang akan menjadi antarmuka dengan metode default.

Cerita ini, "Kelas abstrak versus antarmuka di era JDK 8" awalnya diterbitkan oleh marxsoftware.blogspot.com.