Haruskah metode dalam antarmuka Java dideklarasikan dengan atau tanpa public
pengubah akses?
Secara teknis tidak masalah, tentu saja. Metode kelas yang mengimplementasikan interface
selalu public
. Tetapi apakah konvensi yang lebih baik?
Java sendiri tidak konsisten dalam hal ini. Lihat misalnya Collection
vs Comparable
, atau Future
vs ScriptEngine
.
java
interface
coding-style
public-method
Benno Richters
sumber
sumber
public
dalam konteks ini, metode antarmuka default sekarang dapat (dengan java 9) menjadi pribadi. Saya sarankan Anda menghapus komentar Anda karena sudah usang.public
.Jawaban:
The JLS membuat ini jelas:
sumber
public
bagian sama,and/or abstract
bagian telah dijatuhkan)Pengubah publik harus dihilangkan dalam antarmuka Java (menurut saya).
Karena tidak menambahkan informasi tambahan, itu hanya menarik perhatian dari hal-hal penting.
Kebanyakan panduan gaya akan merekomendasikan Anda untuk tidak menggunakannya, tetapi tentu saja, hal yang paling penting adalah konsisten di seluruh basis kode Anda, dan terutama untuk setiap antarmuka. Contoh berikut dapat dengan mudah membingungkan seseorang, yang tidak 100% fasih berbahasa Jawa:
sumber
Terlepas dari kenyataan bahwa pertanyaan ini telah lama ditanyakan tetapi saya merasa deskripsi yang komprehensif akan menjelaskan mengapa tidak perlu menggunakan abstrak publik sebelum metode dan final statis publik sebelum konstanta antarmuka.
Pertama-tama Antarmuka digunakan untuk menentukan metode umum untuk satu set kelas yang tidak terkait yang setiap kelas akan memiliki implementasi yang unik. Oleh karena itu tidak mungkin untuk menentukan pengubah akses sebagai pribadi karena tidak dapat diakses oleh kelas lain untuk diganti.
Kedua, Meskipun seseorang dapat memulai objek dari jenis antarmuka tetapi antarmuka diwujudkan oleh kelas yang mengimplementasikannya dan tidak diwariskan. Dan karena sebuah antarmuka dapat diimplementasikan (direalisasikan) oleh kelas-kelas berbeda yang tidak terkait yang tidak ada dalam paket yang sama maka pengubah akses yang dilindungi juga tidak valid. Jadi untuk pengubah akses kita hanya dibiarkan dengan pilihan publik.
Ketiga, sebuah antarmuka tidak memiliki implementasi data termasuk variabel instan dan metode. Jika ada alasan logis untuk memasukkan metode yang diimplementasikan atau variabel instan dalam suatu antarmuka maka harus berupa superclass dalam hierarki warisan dan bukan antarmuka. Mempertimbangkan fakta ini, karena tidak ada metode yang dapat diimplementasikan dalam sebuah antarmuka maka semua metode dalam antarmuka harus abstrak.
Keempat, Antarmuka hanya dapat menyertakan konstanta sebagai anggota datanya yang berarti mereka harus final dan tentu saja konstanta akhir dinyatakan statis untuk menjaga hanya satu instance dari mereka. Oleh karena itu final statis juga merupakan keharusan untuk konstanta antarmuka.
Jadi kesimpulannya meskipun menggunakan abstrak publik sebelum metode dan public static final sebelum konstanta dari sebuah antarmuka adalah valid tetapi karena tidak ada pilihan lain itu dianggap berlebihan dan tidak digunakan.
sumber
Dengan diperkenalkannya
private
,static
,default
pengubah untuk metode antarmuka di Jawa 8/9, hal-hal yang lebih rumit dan saya cenderung berpikir bahwa deklarasi penuh lebih mudah dibaca (perlu Java 9 untuk mengkompilasi):sumber
Saya akan menghindari untuk menempatkan pengubah yang diterapkan secara default. Seperti yang ditunjukkan, itu dapat menyebabkan inkonsistensi dan kebingungan.
Yang terburuk yang saya lihat adalah antarmuka dengan metode yang dinyatakan
abstract
...sumber
Saya menggunakan metode menyatakan dengan
public
pengubah, karena membuat kode lebih mudah dibaca, terutama dengan penyorotan sintaksis. Dalam proyek terbaru kami, kami menggunakan Checkstyle yang menampilkan peringatan dengan konfigurasi default untukpublic
pengubah pada metode antarmuka, jadi saya beralih ke menonaktifkannya.Jadi saya tidak begitu yakin yang terbaik, tetapi satu hal yang saya benar-benar tidak suka adalah menggunakan
public abstract
metode antarmuka. Eclipse kadang-kadang melakukan ini saat refactoring dengan "Extract Interface".sumber
Saya selalu menulis apa yang akan saya gunakan jika tidak ada antarmuka dan saya menulis implementasi langsung, yaitu, saya akan gunakan
public
.sumber
Saya lebih suka melewatkannya, saya membaca suatu tempat bahwa antarmuka secara default,
public
danabstract
.Yang mengejutkan saya buku - Head First Design Patterns , menggunakan
public
deklarasi antarmuka dan metode antarmuka ... yang membuat saya memikirkan kembali sekali lagi dan saya mendarat di posting ini.Bagaimanapun, saya pikir informasi yang berlebihan harus diabaikan.
sumber
public
pengubah akses pada deklarasi antarmuka maka tidak akan publik dan abstrak secara default. docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.htmlSaya tidak setuju dengan jawaban populer, bahwa memiliki publik menyiratkan bahwa ada pilihan lain dan karenanya tidak boleh ada. Faktanya adalah bahwa sekarang dengan Java 9 dan di luar sana ADALAH opsi lain.
Saya pikir sebaliknya Java harus menegakkan / mengharuskan 'publik' untuk ditentukan. Mengapa? Karena tidak adanya pengubah berarti akses 'paket' di tempat lain, dan menjadikan ini sebagai kasus khusus yang menyebabkan kebingungan. Jika Anda hanya membuatnya sebagai kesalahan kompilasi dengan pesan yang jelas (mis. "Akses paket tidak diizinkan dalam antarmuka.") Kami akan menghilangkan ambiguitas nyata yang memiliki opsi untuk tidak menyertakan 'publik' yang diperkenalkan.
Perhatikan kata-kata saat ini di: https://docs.oracle.com/javase/specs/jls/se9/html/jls-9.html#jls-9.4
Lihat bahwa 'pribadi' DILAKUKAN sekarang. Saya pikir kalimat terakhir seharusnya sudah dihapus dari JLS. Sangat disayangkan bahwa perilaku "secara implisit publik" pernah diizinkan karena sekarang kemungkinan akan tetap kompatibel dengan keterbelakangan dan menyebabkan kebingungan bahwa tidak adanya pengubah akses berarti 'publik' dalam antarmuka dan 'paket' di tempat lain.
sumber
Alasan untuk metode dalam antarmuka secara default publik dan abstrak tampaknya cukup logis dan jelas bagi saya.
Metode dalam antarmuka itu adalah abstrak default untuk memaksa kelas implementasi untuk menyediakan implementasi dan publik secara default sehingga kelas implementasi memiliki akses untuk melakukannya.
Menambahkan pengubah-pengubah itu dalam kode Anda adalah mubazir dan tidak berguna dan hanya bisa mengarah pada kesimpulan bahwa Anda kurang pengetahuan dan / atau pemahaman dasar-dasar Java.
sumber
Ini sangat subjektif. Saya menghilangkan
public
pengubah berlebihan karena sepertinya berantakan. Sebagaimana disebutkan oleh orang lain - konsistensi adalah kunci dari keputusan ini.Sangat menarik untuk dicatat bahwa desainer bahasa C # memutuskan untuk menegakkan ini. Mendeklarasikan metode antarmuka sebagai publik di C # sebenarnya adalah kesalahan kompilasi. Konsistensi mungkin tidak penting di semua bahasa, jadi saya kira ini tidak benar-benar relevan dengan Java.
sumber
Orang-orang akan mempelajari antarmuka Anda dari penyelesaian kode di IDE mereka atau di Javadoc, bukan dari membaca sumbernya. Jadi tidak ada gunanya menempatkan "publik" di sumber - tidak ada yang membaca sumbernya.
sumber
public
pengubah akses ke antarmuka. Itu adalah dengan desain dan setelah pemikiran yang cermat di belakangnya.