Ya, Anda dapat membuat kelas bertingkat atau kelas dalam di dalam antarmuka Java (perhatikan bahwa berlawanan dengan kepercayaan populer tidak ada yang namanya " kelas dalam statis ": ini tidak masuk akal, tidak ada yang "dalam" dan tidak ada " outter "ketika kelas bertingkat statis, jadi tidak bisa" batin statis ").
Bagaimanapun, berikut ini mengkompilasi dengan baik:
public interface A {
class B {
}
}
Saya pernah melihat itu digunakan untuk meletakkan semacam "pemeriksa kontrak" langsung dalam definisi antarmuka (baik, di kelas bersarang di antarmuka, yang dapat memiliki metode statis, sebaliknya ke antarmuka itu sendiri, yang tidak bisa). Terlihat seperti ini jika saya ingat dengan benar.
public interface A {
static class B {
public static boolean verifyState( A a ) {
return (true if object implementing class A looks to be in a valid state)
}
}
}
Perhatikan bahwa saya tidak mengomentari kegunaan hal semacam itu, saya hanya menjawab pertanyaan Anda: itu bisa dilakukan dan ini adalah salah satu jenis penggunaan yang telah saya lihat.
Sekarang saya tidak akan berkomentar tentang kegunaan konstruksi semacam itu dan dari yang pernah saya lihat: Saya telah melihatnya, tetapi ini bukan konstruksi yang sangat umum.
Basis kode 200KLOC di sini di mana ini terjadi tepat nol waktu (tetapi kemudian kami memiliki banyak hal lain yang kami anggap praktik buruk yang terjadi tepat waktu nol juga sehingga orang lain akan menganggapnya normal jadi ...).
interface
s tidak dapat memiliki kelas dalam. Anda dapat menghilangkanstatic
pengubah dariinterface
kelas bersarang tapi tetap saja, itu adalah kelas bertingkat, bukan kelas dalam.B
kelas tersebut adalah kelas bertingkat statis dan bukan kelas dalam; antarmuka mendapatkan perlakuan khusus. Saya tidak dapat menemukan penyebutan ini secara online, kecuali untuk spesifikasinya sendiri: "Kelas anggota antarmuka secara implisit statis sehingga tidak pernah dianggap sebagai kelas dalam." docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.3Ya, kita dapat memiliki kelas di dalam antarmuka. Salah satu contoh penggunaan bisa jadi
Di sini kode memiliki dua kelas bersarang yang untuk mengenkapsulasi informasi tentang objek acara yang kemudian digunakan dalam definisi metode seperti getKeyEvents (). Memiliki mereka di dalam antarmuka Input meningkatkan kohesi.
sumber
Penggunaan yang valid, IMHO, adalah mendefinisikan objek yang diterima atau dikembalikan oleh metode antarmuka terlampir. Biasanya struktur penyimpanan data. Dengan cara itu, jika objek hanya digunakan untuk antarmuka itu, Anda memiliki hal-hal dengan cara yang lebih kohesif.
Contohnya:
Tapi bagaimanapun ... itu hanya masalah selera.
sumber
Kutipan dari spesifikasi Java 7 :
TIDAK mungkin untuk mendeklarasikan kelas non-statis di dalam antarmuka Java, yang masuk akal bagi saya.
sumber
Kasus penggunaan yang menarik adalah menyediakan semacam implementasi default untuk metode antarmuka melalui kelas dalam seperti yang dijelaskan di sini: https://stackoverflow.com/a/3442218/454667 (untuk mengatasi masalah pewarisan kelas tunggal).
sumber
Ini tentu saja mungkin, dan satu kasus yang menurut saya berguna adalah ketika antarmuka harus mengeluarkan pengecualian khusus. Anda dapat menyimpan pengecualian dengan antarmuka terkaitnya, yang menurut saya sering kali lebih rapi daripada mengotori pohon sumber Anda dengan tumpukan file pengecualian sepele.
sumber
Ya, dimungkinkan untuk memiliki definisi kelas statis di dalam antarmuka, tetapi mungkin aspek yang paling berguna dari fitur ini adalah saat menggunakan jenis enum (yang merupakan jenis kelas statis khusus). Misalnya Anda dapat memiliki sesuatu seperti ini:
sumber
Apa yang disebutkan @Bachi mirip dengan ciri-ciri di Scala dan sebenarnya diimplementasikan menggunakan kelas bersarang di dalam antarmuka. Ini bisa disimulasikan di Java. Lihat juga ciri-ciri java atau pola mixin?
sumber
Mungkin saat Anda menginginkan konstruksi yang lebih kompleks seperti beberapa perilaku implementasi yang berbeda, pertimbangkan:
Ini adalah antarmuka Anda dan ini akan menjadi implementee:
Mungkin memberikan beberapa implementasi statis, tetapi tidak akan membingungkan, saya tidak tahu.
sumber
Saya menemukan kegunaan dari jenis konstruksi ini.
Anda memiliki akses ke semua konstanta yang dikelompokkan; nama kelas bertindak sebagai namespace dalam kasus ini.
sumber
Anda juga dapat membuat kelas statis "Helper" untuk fungsionalitas umum untuk objek yang mengimplementasikan antarmuka ini:
sumber
Saya membutuhkannya sekarang. Saya memiliki antarmuka di mana akan lebih mudah untuk mengembalikan kelas unik dari beberapa metode itu. Kelas ini hanya masuk akal sebagai wadah untuk tanggapan dari metode antarmuka ini.
Oleh karena itu, akan lebih mudah untuk memiliki definisi kelas bertingkat statis, yang dikaitkan hanya dengan antarmuka ini, karena antarmuka ini harus menjadi satu-satunya tempat di mana kelas penampung hasil ini pernah dibuat.
sumber
Misalnya ciri-ciri (seperti antarmuka dengan metode yang diterapkan) di Groovy. Mereka dikompilasi ke antarmuka yang berisi kelas dalam tempat semua metode diimplementasikan.
sumber