Di Java 8 dan yang lebih baru, jawaban atas pertanyaan ini masih valid tetapi sekarang lebih bernuansa.
Pertama, pernyataan dari jawaban yang diterima ini tetap benar:
- antarmuka dimaksudkan untuk menentukan perilaku implisit mereka dalam kontrak (pernyataan aturan untuk perilaku yang harus dipatuhi oleh kelas pelaksana agar dianggap valid)
- ada perbedaan antara kontrak (aturan) dan implementasi (pengkodean programmatic dari aturan)
- metode yang ditentukan dalam antarmuka HARUS SELALU diimplementasikan (di beberapa titik)
Lantas, apa nuansa baru di Java 8 ini? Saat berbicara tentang "Metode Opsional", salah satu dari berikut ini sekarang tepat:
1. Metode yang implementasinya bersifat opsional secara kontrak
"Pernyataan ketiga" mengatakan bahwa metode antarmuka abstrak harus selalu diterapkan dan ini tetap berlaku di Java 8+. Namun, seperti dalam Java Collections Framework, beberapa metode antarmuka abstrak dapat dijelaskan sebagai "opsional" dalam kontrak.
Dalam hal ini, penulis yang mengimplementasikan antarmuka dapat memilih untuk tidak mengimplementasikan metode tersebut. Akan tetapi, compiler akan menuntut sebuah implementasi, dan karenanya penulis menggunakan kode ini untuk setiap metode opsional yang tidak diperlukan dalam kelas implementasi tertentu:
public SomeReturnType optionalInterfaceMethodA(...) {
throw new UnsupportedOperationException();
}
Di Java 7 dan sebelumnya, ini benar-benar satu-satunya jenis "metode opsional" yang ada, yaitu metode yang, jika tidak diterapkan, akan menampilkan UnsupportedOperationException. Perilaku ini harus ditentukan oleh kontrak antarmuka (mis. Metode antarmuka opsional dari Java Collections Framework).
2. Metode default yang penerapan ulangnya adalah opsional
Java 8 memperkenalkan konsep metode default . Ini adalah metode yang implementasinya dapat dan disediakan oleh definisi antarmuka itu sendiri. Secara umum hanya mungkin untuk menyediakan metode default ketika tubuh metode dapat ditulis menggunakan metode antarmuka lain (yaitu, "primitif"), dan bila this
dapat berarti "objek ini yang kelasnya telah mengimplementasikan antarmuka ini".
Metode default harus memenuhi kontrak antarmuka (seperti implementasi metode antarmuka lainnya harus). Oleh karena itu, menentukan implementasi metode antarmuka dalam kelas pelaksana adalah kebijaksanaan penulis (selama perilakunya sesuai dengan tujuannya).
Di lingkungan baru ini, Java Collections Framework dapat ditulis ulang sebagai:
public interface List<E> {
:
:
default public boolean add(E element) {
throw new UnsupportedOperationException();
}
:
:
}
Dengan cara ini, metode "opsional" add()
memiliki perilaku default yaitu melontarkan UnsupportedOperationException jika kelas implementasi tidak menyediakan perilaku baru sendiri, yang persis seperti yang Anda inginkan terjadi dan yang sesuai dengan kontrak untuk List. Jika seorang penulis sedang menulis sebuah kelas yang tidak memperbolehkan elemen baru untuk ditambahkan ke implementasi List, implementasi dari add()
adalah opsional karena perilaku default persis seperti yang dibutuhkan.
Dalam kasus ini, "pernyataan ketiga" di atas masih berlaku, karena metode tersebut telah diterapkan di antarmuka itu sendiri.
3. Metode yang mengembalikan Optional
hasil
Jenis baru terakhir dari metode opsional hanyalah metode yang mengembalikan file Optional
. The Optional
kelas menyediakan cara yang jelas lebih berorientasi objek berurusan dengan null
hasil.
Dalam gaya pemrograman yang lancar, seperti jenis yang biasa terlihat saat membuat kode dengan Java Streams API baru, hasil nol pada titik mana pun menyebabkan program mogok dengan NullPointerException. The Optional
kelas menyediakan mekanisme untuk mengembalikan hasil nol untuk kode klien dengan cara yang memungkinkan gaya fasih tanpa menyebabkan kode klien untuk kecelakaan.