kelas abstrak dan antarmuka adalah dua mekanisme dalam bahasa Java yang mendukung definisi kelas abstrak. Justru karena keberadaan kedua mekanisme inilah Java diberikan kemampuan berorientasi objek yang kuat. Ada kemiripan yang besar antara kelas abstrak dan antarmuka dalam hal dukungan untuk definisi kelas abstrak, dan keduanya bahkan dapat saling menggantikan satu sama lain. Oleh karena itu, banyak pengembang tampaknya lebih santai dalam memilih kelas abstrak dan antarmuka saat mendefinisikan kelas abstrak. Faktanya, masih terdapat perbedaan besar di antara keduanya. Pilihannya bahkan mencerminkan pemahaman tentang sifat domain masalah dan apakah pemahaman maksud desain sudah benar dan masuk akal. Artikel ini akan menganalisis perbedaan di antara keduanya dan mencoba memberikan dasar bagi pengembang untuk memilih di antara keduanya.
Memahami kelas abstrak
Kelas abstrak dan antarmuka keduanya digunakan untuk membuat kelas abstrak dalam bahasa Java (kelas abstrak dalam artikel ini tidak diterjemahkan dari kelas abstrak, ini mewakili tubuh abstrak, dan kelas abstrak adalah metode yang digunakan untuk mendefinisikan kelas abstrak dalam bahasa Java), pembaca mohon diperhatikan untuk membedakan) definisinya, lalu apa itu kelas abstrak, dan manfaat apa yang bisa kita dapatkan dari penggunaan kelas abstrak?
Dalam konsep berorientasi objek, kita mengetahui bahwa semua objek direpresentasikan oleh kelas, namun hal sebaliknya tidak berlaku. Tidak semua kelas digunakan untuk mendeskripsikan objek. Jika suatu kelas tidak berisi informasi yang cukup untuk mendeskripsikan objek tertentu, kelas tersebut adalah kelas abstrak. Kelas abstrak sering digunakan untuk mewakili konsep-konsep abstrak yang kita peroleh dari analisis dan desain area masalah. Kelas-kelas tersebut merupakan abstraksi dari serangkaian konsep spesifik yang terlihat berbeda tetapi pada dasarnya sama. Misalnya: Jika kita mengembangkan perangkat lunak pengedit grafis, kita akan menemukan bahwa ada beberapa konsep khusus seperti lingkaran dan segitiga dalam domain masalahnya.Mereka berbeda, tetapi semuanya termasuk dalam konsep bentuk dalam domain masalah. Jika ada, itu adalah konsep abstrak. Justru karena konsep abstrak tidak memiliki konsep konkrit yang sesuai dalam domain permasalahan, sehingga kelas abstrak yang digunakan untuk merepresentasikan konsep abstrak tidak dapat dipakai.
Di bidang berorientasi objek, kelas abstrak terutama digunakan untuk menyembunyikan tipe. Kita dapat membuat deskripsi abstrak dari sekumpulan perilaku yang tetap, namun kumpulan perilaku ini dapat mempunyai sejumlah kemungkinan implementasi konkrit. Deskripsi abstrak ini adalah kelas abstrak, dan kumpulan implementasi konkrit yang mungkin diwakili oleh semua kelas turunan yang mungkin. Modul dapat beroperasi pada badan abstrak. Karena sebuah modul bergantung pada abstraksi tetap, ia tidak dapat dimodifikasi pada saat yang sama, perilaku modul ini juga dapat diperluas dengan menurunkan dari abstraksi ini. Pembaca yang akrab dengan OCP pasti tahu bahwa untuk mewujudkan OCP (Open-ClosedPrinciple), salah satu prinsip inti desain berorientasi objek, kelas abstrak adalah kuncinya.
Melihat kelas abstrak dan antarmuka dari tingkat definisi tata bahasa
Pada tingkat tata bahasa, bahasa Java memberikan definisi berbeda untuk kelas abstrak dan antarmuka. Berikut ini adalah contoh pendefinisian kelas abstrak bernama Demo untuk menggambarkan perbedaan ini.
Cara mendefinisikan kelas abstrak Demo menggunakan kelas abstrak adalah sebagai berikut:
Dari perspektif pemrograman, kelas abstrak dan antarmuka dapat digunakan untuk mengimplementasikan gagasan "desain demi kontrak". Namun, masih terdapat beberapa perbedaan dalam penggunaan spesifiknya.
Pertama-tama, kelas abstrak mewakili hubungan warisan dalam bahasa Java, dan sebuah kelas hanya dapat menggunakan hubungan warisan satu kali. Namun, sebuah kelas dapat mengimplementasikan banyak antarmuka. Mungkin ini merupakan pertimbangan kompromi oleh para perancang bahasa Java ketika mempertimbangkan dukungan Java untuk pewarisan berganda.
Kedua, dalam definisi kelas abstrak, kita dapat menetapkan perilaku default metode tersebut. Namun dalam definisi antarmuka, metode tidak boleh memiliki perilaku default untuk menghindari batasan ini, delegasi harus digunakan, tetapi ini akan menambah kompleksitas dan terkadang menyebabkan banyak masalah.
Ada masalah serius lainnya karena tidak dapat mendefinisikan perilaku default di kelas abstrak, yang dapat menyebabkan masalah pemeliharaan. Karena jika nanti Anda ingin memodifikasi antarmuka kelas (biasanya diwakili oleh kelas abstrak atau antarmuka) untuk beradaptasi dengan situasi baru (misalnya menambahkan metode baru atau menambahkan parameter baru ke metode yang sudah ada), itu akan sangat merepotkan, dan mungkin Membutuhkan banyak waktu (apalagi bila kelas turunannya banyak). Namun jika antarmuka diimplementasikan melalui kelas abstrak, maka Anda mungkin hanya perlu mengubah perilaku default yang ditentukan dalam kelas abstrak.
Demikian pula, jika perilaku default tidak dapat didefinisikan dalam kelas abstrak, penerapan metode yang sama akan muncul di setiap kelas turunan dari kelas abstrak, melanggar prinsip "satu aturan, satu tempat", yang mengakibatkan duplikasi kode, yang juga tidak kondusif untuk pemeliharaan di masa depan. Oleh karena itu, berhati-hatilah saat memilih antara kelas abstrak dan antarmuka.
Melihat kelas abstrak dan antarmuka dari sudut pandang konsep desain. Hal di atas terutama membahas perbedaan antara kelas abstrak dan antarmuka dari sudut pandang definisi tata bahasa dan pemrograman. Bagian ini akan menganalisis perbedaan antara kelas abstrak dan antarmuka dari level lain: konsep desain yang direfleksikan oleh keduanya. Penulis percaya itu