Dimulai dengan Java 8, default
metode diperkenalkan ke antarmuka. Secara efektif, ini berarti bahwa tidak semua metode dalam suatu interface
are abstract
.
Dimulai dengan Java 9 (mungkin), private
metode akan diizinkan. Ini berarti bahwa tidak semua metode di dalam interface
adalah public abstract
.
Pertanyaan "Haruskah metode dalam antarmuka Java dideklarasikan dengan atau tanpa public
pengubah akses?" ditanya di Stack Overflow di /programming/161633/should-methods-in-a-java-interface-be-declared-with-or-without-a-public-access-m
Di sana, sebagian besar jawaban berpendapat bahwa public abstract
tidak boleh digunakan karena tidak ada metode dalam interface
dapat apa pun selain public abstract
. Tidak lagi demikian.
Jadi, mengingat fitur antarmuka baru ini, haruskah public abstract
kata kunci digunakan dalam deklarasi metode antarmuka Java?
Dalam lingkungan spesifik saya, kami akan memiliki orang-orang yang berpengalaman insinyur perangkat lunak, tetapi tidak berpengalaman di Jawa, membaca kode Java dari waktu ke waktu. Saya merasa bahwa meninggalkan public abstract
kata kunci sekarang akan menciptakan titik kebingungan tambahan bagi mereka yang tidak terbiasa dengan sejarah tentang bagaimana antarmuka memiliki aturan yang berbeda untuk menggunakan kata kunci ini.
sumber
default
pengubah ataustatic
pengubah secara implisitabstract
... Itu diizinkan, tetapi berkecil hati karena masalah gaya, untuk menentukan secara berlebihanabstract
pengubah untuk deklarasi metode seperti itu. " Mengapa Anda berharap bahwa segala sesuatu harus berubah?abstract
menjadi semakin berbelit-belit. Di Java 9, kalimat yang sama mungkin, "Metode antarmuka yang tidak memilikidefault
pengubah ataustatic
pengubah atauprivate
pengubah secara abstrak ..." Selain itu, argumen tambahan untuk tidak secara eksplisit menggunakan kata kunci, yaitu, bahwa semua metode antarmukapublic abstract
, sekarang diperdebatkan.stream
untukjava.util.Collection
, atauMap.getOrDefault()
. Alternatifnya adalah membuat sub-antarmuka baru, dan membuat semua orang downcast, seperti Graphics2D, dan tidak ada yang menikmatinya!Jawaban:
Untuk memperluas jawaban StackOverflow:
The
public
akses pengubah tidak diperlukan karenaThe
abstract
akses pengubah tidak diperlukan karenaDan...
Karena metode default memiliki badan, dan yang tidak bersifat abstrak, dan setiap deklarasi metode pada antarmuka bersifat publik, Anda tidak perlu menentukan kata kunci mana pun.
Salah satu komentar pada jawaban mengatakan:
Sebuah komentar pada pertanyaan StackOverflow (terpilih 18 kali) membantah ini:
Implikasi kode, terutama antarmuka, adalah penting.
sumber
Bukankah kurangnya implikasi pernyataan blok cukup? Apakah Anda akan menyatakannya
extends Object
meskipun tersirat?Jika pengembang tidak memahami redundansi, kemungkinan mereka mungkin tidak sepenuhnya memahami konsep di balik fitur bahasa , yang merupakan masalah yang lebih besar daripada bingung tentang pengubah.
Pengembang harus memahami bahwa tujuan antarmuka adalah untuk membuat kontrak yang menentukan bagaimana klien dapat berinteraksi dengan suatu objek. Ini menyarankan metode apa pun dalam antarmuka yang digunakan untuk interaksi objek harus diekspos kepada klien.
Jika Anda mendeklarasikan metode pribadi, Anda secara eksplisit menyatakan bahwa metode ini tidak dimaksudkan untuk dipanggil oleh klien, yang dalam hal antarmuka adalah sesuatu yang tidak dapat dengan mudah disimpulkan.
sumber
public abstract
sebelumnya, terlepas dari gaya polisi, karena itu membuat semuanya menjadi jelas dan mengingatkan pembaca. Sekarang saya dibenarkan karena Java 8 dan 9 menyulitkan hal-hal :-). Java sudah banyak yang mubazir.extends Object
ke setiap kelas yang langsung berasalObject
? Ini adalah informasi yang harus diketahui oleh pengembang, itulah sebabnya disimpulkan. Semakin sedikit informasi yang tidak berguna di layar, semakin mudah untuk memproses informasi penting. Semoga saya sudah meyakinkan Anda untuk datang ke sisi gelap (mengerti? Karena hal-hal implisit tidak dapat dilihat). Jika tidak, itu layak dicoba haha. Pada akhirnya, tergantung pada apa yang membuat kode lebih mudah dikelola untuk pengembangfinal
argumen metode sebelum kecuali sesuatu yang lucu mengharuskannya (seperti kelas dalam anonim dll ...)extends Object
, tetapi pasti akan menaikkan bendera dan membuat saya mempertanyakan mengapa. Seperti yang saya sebutkan di posting, melakukan hal-hal seperti itu dapat menyiratkan bahwa pengembang mungkin memiliki kesalahpahaman tentang cara kerja sesuatu (mungkin tidak tahu bahwa semua objek sudah diperluasObject
, maka ekstensi eksplisit)