Haruskah metode dalam antarmuka Java dideklarasikan dengan atau tanpa pengubah akses publik?

292

Haruskah metode dalam antarmuka Java dideklarasikan dengan atau tanpa publicpengubah akses?

Secara teknis tidak masalah, tentu saja. Metode kelas yang mengimplementasikan interfaceselalu public. Tetapi apakah konvensi yang lebih baik?

Java sendiri tidak konsisten dalam hal ini. Lihat misalnya Collectionvs Comparable, atau Futurevs ScriptEngine.

Benno Richters
sumber
22
Itu buruk karena menuliskannya sebagai publik menyiratkan bahwa itu bisa non-publik
Pacerier
8
Anda harus menghindari sintaks yang berlebihan dari bentuk apa pun.
Marquis of Lorne
3
@ Peracerier, sementara saya setuju bahwa itu buruk untuk digunakan publicdalam konteks ini, metode antarmuka default sekarang dapat (dengan java 9) menjadi pribadi. Saya sarankan Anda menghapus komentar Anda karena sudah usang.
aioobe
2
Ya, berbagai hal dapat berubah di Jawa 9. "Menulisnya sebagai publik menyiratkan bahwa itu bisa non-publik" . Karena hal itu tampaknya mungkin di Jawa 9, argumen ini sekarang bermanfaat untuk menulis public.
MC Kaisar

Jawaban:

334

The JLS membuat ini jelas:

Itu diizinkan, tetapi tidak disarankan karena masalah gaya, untuk secara berlebihan menentukan publicdan / atau abstractpengubah untuk metode yang dideklarasikan dalam antarmuka.

Jon Skeet
sumber
6
Tautan JLS di atas adalah untuk Java 7 pada saat saya membacanya. Setelah komentar tentang Java 9 memungkinkan metode non-publik, saya hanya ingin mengkonfirmasi bahwa kata-kata yang sangat mirip masih ada untuk SE9 JLS . ( publicbagian sama, and/or abstractbagian telah dijatuhkan)
OzgurH
3
Masih berlaku di SE11 JLS
Ortomala Lokni
44

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:

public interface Foo{
  public void MakeFoo();
  void PerformBar();
}
Rasmus Faber
sumber
3
Apakah Anda memiliki tautan ke panduan gaya seperti itu?
Benno Richters
9
Sejauh ini konsistensi adalah hal yang paling penting, dan merupakan jawaban untuk 99% dari jenis pertanyaan ini.
SCdF
Kesepakatan ulang: disepakati. Sesuatu untuk dokumen standar pengodean kalian :)
JeeBee
2
Bno: Salah satu contohnya adalah Spesifikasi Bahasa Jawa, yang lain adalah Checkstyle.
Rasmus Faber
9

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.

Leo The Four
sumber
7

Dengan diperkenalkannya private, static, defaultpengubah 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):

public interface MyInterface {

    //minimal
    int CONST00 = 0;
    void method00();
    static void method01() {}
    default void method02() {}
    private static void method03() {}
    private void method04() {}

    //full
    public static final int CONST10 = 0;
    public abstract void method10();
    public static void method11() {}
    public default void method12() {}
    private static void method13() {}
    private void method14() {}

}
Werner Thumann
sumber
5

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...

PhiLho
sumber
5

Saya menggunakan metode menyatakan dengan publicpengubah, karena membuat kode lebih mudah dibaca, terutama dengan penyorotan sintaksis. Dalam proyek terbaru kami, kami menggunakan Checkstyle yang menampilkan peringatan dengan konfigurasi default untuk publicpengubah 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 abstractmetode antarmuka. Eclipse kadang-kadang melakukan ini saat refactoring dengan "Extract Interface".

cretzel
sumber
2
Tetapi hanya jika Anda mencentang dua kotak centang menyatakan metode sebagai publik, abstrak.
MetroidFan2002
4

Saya selalu menulis apa yang akan saya gunakan jika tidak ada antarmuka dan saya menulis implementasi langsung, yaitu, saya akan gunakan public.

Astaga
sumber
6
Apakah Anda juga secara eksplisit menyatakan semua metode antarmuka abstrak?
Dan Dyer
4
Ini adalah antarmuka, bukan kelas abstrak. Mengenai 'publik', ada 7 karakter yang Anda ketikkan pada saat Anda memikirkannya, masalah besar! Dan begitulah ia akan didefinisikan dalam implementasi juga, yaitu +1 untuk konsistensi menyeimbangkan -1 untuk redundansi.
JeeBee
3

Saya lebih suka melewatkannya, saya membaca suatu tempat bahwa antarmuka secara default, publicdan abstract.

Yang mengejutkan saya buku - Head First Design Patterns , menggunakan publicdeklarasi 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.

Pradeep Sharma
sumber
1
Hanya untuk memperjelas, jika Anda menghilangkan publicpengubah akses pada deklarasi antarmuka maka tidak akan publik dan abstrak secara default. docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html
Jabbslad
3

Saya 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

"Suatu metode dalam tubuh antarmuka dapat dideklarasikan publik atau pribadi (§6.6). Jika tidak ada pengubah akses yang diberikan, metode tersebut secara implisit bersifat publik. Metode ini diizinkan, tetapi tidak disarankan karena masalah gaya, untuk menentukan publik secara berlebihan pengubah untuk deklarasi metode dalam sebuah antarmuka. "

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.

swpalmer
sumber
2

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.

Iuliana Cosmina
sumber
Tetapi Anda juga dapat menerapkan metode abstrak yang memiliki akses yang dilindungi - dalam kelas abstrak. Jadi publik bukan keharusan. Menambahkan sesuatu yang eksplisit yang sama dengan apa yang akan menjadi default selalu berlebihan, tetapi tidak selalu sia-sia.
swpalmer
Tetapi pertanyaannya adalah tentang antarmuka. Saya tidak mau ngelantur. Maksud saya, sejak Java 8, kita juga dapat berbicara tentang metode pribadi dan default di antarmuka, bukan? Jadi diskusi ini bisa dibuat cukup lama jika kita mau. ;)
Iuliana Cosmina
1

Ini sangat subjektif. Saya menghilangkan publicpengubah 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.

serg10
sumber
-9

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.

Tim Boudreau
sumber
8
Saya benar-benar harus tidak setuju dengan pernyataan bahwa tidak ada yang membaca sumbernya. Saya pikir banyak orang menggunakan F3 misalnya di Eclipse untuk memperbesar kode. Alat seperti Maven menawarkan opsi untuk mengunduh sumber, bukan hanya JavaDoc, karena suatu alasan.
Benno Richters
Itu bukan alasan yang tepat untuk tidak menambahkan public pengubah akses ke antarmuka. Itu adalah dengan desain dan setelah pemikiran yang cermat di belakangnya.
mtk