Mengapa orang menyatakan metode antarmuka Java sebagai abstrak?


143

Saya menggunakan fitur refactoring "antarmuka tarik" dari Eclipse hari ini untuk membuat antarmuka berdasarkan kelas yang ada. Kotak dialog ditawarkan untuk membuat semua metode baru dari antarmuka baru sebagai metode "abstrak".

Apa manfaatnya?

Saya pikir fakta bahwa Anda diizinkan untuk mendeklarasikan metode antarmuka sebagai abstrak adalah fitur bahasa yang berlebihan dan tidak berbahaya yang tidak terlalu dianjurkan.

Mengapa Eclipse mendukung gaya seperti itu, atau mengapa seseorang secara sukarela memilih untuk melakukannya?

Klarifikasi: Saya tidak bertanya mengapa metode antarmuka abstrak, itu jelas. Saya bertanya mengapa seseorang secara eksplisit memilih untuk menandai mereka sebagai abstrak karena jika mereka berada di antarmuka mereka tetap abstrak.

Jawaban:


146

Menurut Spesifikasi Bahasa Jawa , abstractkata kunci untuk antarmuka sudah usang dan tidak boleh lagi digunakan. (Bagian 9.1.1.1)

Yang mengatakan, dengan kecenderungan Java untuk kompatibilitas ke belakang, saya benar-benar ragu itu akan membuat perbedaan apakah abstractkata kunci tersebut ada.


1
Itulah pemahaman saya (meskipun saya tidak terbiasa dengan bagian JLS tertentu). Aku bertanya-tanya mengapa Eclipse akan menawarkan saya pilihan untuk menciptakan obselete menandai ...
Uri

Dapatkan saya Seseorang di suatu tempat keharusan dari memutuskan itu adalah diinginkan "fitur" dan memasukkannya ke dalam Kau tahu, salah satu dari mereka lihai jenis open-source :).
jdmichal

18
Meskipun ini adalah jawaban berperingkat teratas, ini merujuk pada bagian Spesifikasi yang salah; 9.1.1.1 menggambarkan abstractkata kunci pada deklarasi antarmuka itu sendiri, bukan pada anggotanya. @ Will menjawab di bawah ini dengan benar dan juga berisi sumber tautan yang valid.
Shaggy Frog

39

"Manfaatnya" (menambahkan abstrak pada deklarasi metode antarmuka) dalam eclipse akan menjadi masalah kompatibilitas yang lama dengan kompiler jdt eclipse di jdk1.3

Sejak 1.4, pustaka jdk tidak lagi berisi metode abstrak default (pada kelas abstrak yang mengimplementasikan antarmuka).
Ini membodohi diagnosis kompiler Eclipse 1.3 karena implementasi mereka bergantung pada keberadaan mereka.
Perhatikan bahwa Javac 1.3 akan menolak sama sekali untuk melakukan terhadap 1,4 pustaka (menggunakan opsi -bootclasspath).

Karena kompilator Eclipse kemungkinan berada di tingkat kepatuhan 1,4 (lihat Workbench>Preferences>Java>Compiler>JDK Compliance), atau menggunakan setidaknya perpustakaan kelas 1,3 jika menggunakan mode kepatuhan 1,3, kehadiran "abstrak" tidak diperlukan di sebagian besar proyek gerhana saat ini.


3
Bagus temukan. Jadi fungsinya untuk mengatasi masalah yang tidak ada lagi di kompiler Eclipse.
jdmichal

1
@ jdmichal: tepat, dan itu juga jawaban yang lebih akurat untuk pertanyaan Uri.
VonC

39

Dari Java SE 7 JLS (Spesifikasi Bahasa Jawa): "Ini diizinkan, tetapi tidak disarankan karena masalah gaya, untuk secara berlebihan menentukan pengubah publik dan / atau abstrak untuk metode yang dideklarasikan dalam sebuah antarmuka."

Untuk Java SE 5.0 : "Untuk kompatibilitas dengan versi Java platform yang lebih lama, itu diperbolehkan tetapi tidak dianjurkan, sebagai soal gaya, untuk secara berlebihan menentukan pengubah abstrak untuk metode yang dideklarasikan dalam antarmuka."


9

Menurut metode JLS di antarmuka abstrak secara default, sehingga kata kunci berlebihan. Mengetahui hal ini, saya tidak akan pernah menggunakannya untuk "menghindari kekacauan presentasional".


Ini harus menjadi jawaban yang tepat. Berikut ini tautan yang diperbarui - lihat bagian "note"
mork

JLS tidak mengatakan kata kunci usang untuk metode dalam antarmuka. Ia mengatakan, "Ini diperbolehkan, tetapi tidak dianjurkan karena gaya, untuk secara berlebihan menentukan pengubah publik dan / atau abstrak untuk suatu metode yang dideklarasikan dalam sebuah antarmuka." JLS # 9.4 .
Marquis of Lorne

@ EJP Saya tidak mengatakan bahwa JLS menyatakan kata kunci akan usang, ini adalah pendapat pribadi saya;) BTW mereka mencatat kata kunci ini menjadi "berlebihan" yang tidak sama dengan usang, dalam hal ini Anda benar tentu saja . Sekarang saya tahu saya akan mengedit jawaban untuk memperjelas ini.
Daniel Hiller
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.