Di Java, kelas bertingkat bisa berupa salah satu static
atau tidak. Jika ya static
, mereka tidak berisi referensi ke pointer dari instance yang memuatnya (mereka juga tidak lagi disebut kelas dalam, mereka disebut kelas bersarang).
Lupa membuat kelas bersarang static
jika tidak membutuhkan referensi tersebut dapat menyebabkan masalah pada pengumpulan sampah atau escape analysis.
Apakah mungkin untuk membuat kelas dalam anonim static
juga? Atau apakah kompilator mengetahui hal ini secara otomatis (yang bisa, karena tidak dapat ada subkelas)?
Misalnya, jika saya membuat pembanding anonim, saya hampir tidak pernah membutuhkan referensi ke luar:
Collections.sort(list, new Comparator<String>(){
int compare(String a, String b){
return a.toUpperCase().compareTo(b.toUpperCase());
}
}
java
syntax
inner-classes
Thilo
sumber
sumber
Collections.sort(list, String.CASE_INSENSITIVE_ORDER)
berfungsi sejak Java 2, baca, karena API Koleksi ada…Jawaban:
Tidak, Anda tidak bisa, dan tidak, kompilator tidak bisa memahaminya. Inilah sebabnya mengapa FindBugs selalu menyarankan untuk mengubah kelas dalam anonim menjadi
static
kelas bertingkat bernama jika mereka tidak menggunakanthis
referensi implisitnya .Edit: Tom Hawtin - tackline mengatakan bahwa jika kelas anonim dibuat dalam konteks statis (misalnya dalam
main
metode), kelas anonim sebenarnyastatic
. Tapi JLS tidak setuju :Glosarium Java Roedy Green mengatakan bahwa fakta bahwa kelas anonim diperbolehkan dalam konteks statis bergantung pada implementasi:
Edit 2: JLS sebenarnya mencakup konteks statis secara lebih eksplisit di §15.9.2 :
Jadi kelas anonim dalam konteks statis secara kasar setara dengan
static
kelas bertingkat yang tidak menyimpan referensi ke kelas yang melingkupi, meskipun secara teknis bukanstatic
kelas.sumber
true
menggunakan javac (sun-jdk-1.7.0_10) danfalse
menggunakan compiler Eclipse.Agak. Kelas dalam anonim yang dibuat dengan metode statis jelas akan menjadi statis secara efektif karena tidak ada sumber untuk bagian luar ini.
Ada beberapa perbedaan teknis antara kelas dalam dalam konteks statis dan kelas bertingkat statis. Jika Anda tertarik, baca JLS 3rd Ed.
sumber
Saya pikir ada sedikit kebingungan dalam nomenklatur di sini, yang memang terlalu konyol dan membingungkan.
Apa pun sebutan Anda, pola ini (dan beberapa variasi dengan visibilitas berbeda) semuanya mungkin, normal, legal Java:
Mereka dipenuhi dalam spesifikasi bahasa (jika Anda benar-benar terganggu, lihat bagian 15.9.5.1 untuk yang ada di dalam metode statis).
Tapi kutipan ini salah :
Saya pikir penulis yang dikutip membingungkan kata kunci statis dengan konteks statis . (Memang, JLS juga agak membingungkan dalam hal ini.)
Sejujurnya, semua pola di atas baik-baik saja (apa pun yang Anda sebut "bersarang", "dalam", "anonim" apa pun ...). Sungguh, tidak ada yang akan tiba-tiba menghapus fungsi ini pada rilis Java berikutnya. Secara jujur!
sumber
new
danJComponent
dalam contoh ketiga Anda.Kelas-kelas dalam tidak boleh statis - kelas bertingkat statis bukanlah kelas dalam. Tutorial Java membahasnya di sini .
sumber
kelas dalam anonim tidak pernah statis (mereka tidak dapat mendeklarasikan metode statis atau bidang statis non final), tetapi jika mereka didefinisikan dalam konteks statis (metode statis atau bidang statis) mereka berperilaku sebagai statis dalam arti bahwa mereka tidak bisa mengakses anggota non-statis (misalnya) dari kelas yang melingkupi (seperti yang lainnya dari konteks statis)
sumber
Pada catatan membuat kelas dalam anonim statis dengan memanggil mereka dalam metode statis.
Ini tidak benar-benar menghapus referensi. Anda dapat mengujinya dengan mencoba membuat serial kelas anonim dan tidak membuat kelas yang melingkupi dapat diserialkan.
sumber