Salah satu fitur Java 8 yang paling berguna adalah default
metode baru pada antarmuka. Pada dasarnya ada dua alasan (mungkin ada yang lain) mengapa mereka diperkenalkan:
- Memberikan implementasi standar aktual. Contoh:
Iterator.remove()
- Mengizinkan evolusi JDK API. Contoh:
Iterable.forEach()
Dari perspektif perancang API, saya ingin dapat menggunakan pengubah lain pada metode antarmuka, misalnya final
. Ini akan berguna ketika menambahkan metode kenyamanan, mencegah penggantian "tidak disengaja" dalam mengimplementasikan kelas:
interface Sender {
// Convenience method to send an empty message
default final void send() {
send(null);
}
// Implementations should only implement this method
void send(String message);
}
Di atas sudah merupakan praktik umum jika Sender
kelas:
abstract class Sender {
// Convenience method to send an empty message
final void send() {
send(null);
}
// Implementations should only implement this method
abstract void send(String message);
}
Sekarang, default
dan final
jelas-jelas bertentangan dengan kata kunci, tetapi kata kunci default itu sendiri tidak sepenuhnya diperlukan , jadi saya berasumsi bahwa kontradiksi ini disengaja, untuk mencerminkan perbedaan halus antara "metode kelas dengan tubuh" (hanya metode) dan "antarmuka" metode dengan tubuh " (metode default), yaitu perbedaan yang belum saya mengerti.
Pada beberapa titik waktu, dukungan untuk modifier seperti static
dan final
pada metode antarmuka belum sepenuhnya dieksplorasi, mengutip Brian Goetz :
Bagian lainnya adalah seberapa jauh kita akan pergi untuk mendukung alat-alat kelas-bangunan di antarmuka, seperti metode final, metode pribadi, metode yang dilindungi, metode statis, dll. Jawabannya adalah: kita belum tahu
Sejak saat itu di akhir 2011, jelas, dukungan untuk static
metode dalam antarmuka telah ditambahkan. Jelas, ini menambahkan banyak nilai ke perpustakaan JDK sendiri, seperti dengan Comparator.comparing()
.
Pertanyaan:
Apa alasannya final
(dan juga static final
) tidak pernah berhasil ke antarmuka Java 8?
final
mencegah metode ditimpa, dan melihat bagaimana Anda HARUS mengganti metode yang diwarisi dari antarmuka, saya tidak mengerti mengapa masuk akal untuk membuatnya final. Kecuali jika itu menandakan bahwa metode ini adalah final SETELAH menimpa itu sekali .. Dalam hal itu, mungkin ada kesulitan qas? Jika saya tidak memahami hak ini, izinkan saya kmow. Tampaknya menarik
final
akan digunakan dalam mencegah implementasi kelas dari mengesampingkan implementasi standar metode antarmuka.