Apa gunanya kelas anonim di Jawa? Bisakah kita mengatakan bahwa penggunaan kelas anonim adalah salah satu kelebihan Java?
309
Apa gunanya kelas anonim di Jawa? Bisakah kita mengatakan bahwa penggunaan kelas anonim adalah salah satu kelebihan Java?
Jawaban:
Dengan "kelas anonim", saya menganggap Anda maksud kelas batin anonim .
Kelas dalam anonim dapat berguna ketika membuat instance dari objek dengan "ekstra" tertentu seperti metode overriding, tanpa harus benar-benar subkelas kelas.
Saya cenderung menggunakannya sebagai jalan pintas untuk melampirkan pendengar acara:
Menggunakan metode ini membuat pengkodean sedikit lebih cepat, karena saya tidak perlu membuat kelas tambahan yang mengimplementasikan
ActionListener
- Saya hanya dapat membuat instance kelas batin anonim tanpa benar-benar membuat kelas yang terpisah.Saya hanya menggunakan teknik ini untuk tugas "cepat dan kotor" di mana membuat seluruh kelas terasa tidak perlu. Memiliki beberapa kelas batin anonim yang melakukan hal yang persis sama harus di refactored ke kelas yang sebenarnya, baik itu kelas batin atau kelas terpisah.
sumber
overloading methods
dan tidakoverriding methods
?Kelas dalam anonim secara efektif ditutup, sehingga dapat digunakan untuk meniru ekspresi lambda atau "delegasi". Misalnya, ambil antarmuka ini:
Anda dapat menggunakan ini secara anonim untuk membuat fungsi kelas satu di Java. Katakanlah Anda memiliki metode berikut yang mengembalikan angka pertama lebih besar dari pada daftar yang diberikan, atau jika tidak ada angka yang lebih besar:
Dan kemudian Anda memiliki metode lain yang mengembalikan angka pertama lebih kecil dari saya dalam daftar yang diberikan, atau saya jika tidak ada nomor lebih kecil:
Metode-metode ini hampir identik. Menggunakan fungsi kelas-pertama tipe F, kita dapat menulis ulang ini menjadi satu metode sebagai berikut:
Anda bisa menggunakan kelas anonim untuk menggunakan metode firstMatch:
Ini adalah contoh yang benar-benar dibuat-buat, tetapi mudah untuk melihat bahwa dapat melewati fungsi seolah-olah mereka nilai adalah fitur yang sangat berguna. Lihat "Bisakah Bahasa Pemrograman Anda Melakukan Ini" oleh Joel sendiri.
Perpustakaan yang bagus untuk pemrograman Java dengan gaya ini: Java Fungsional.
sumber
Kelas dalam anonim digunakan dalam skenario berikut:
1.) Untuk Overriding (Sub classing), Ketika definisi kelas tidak dapat digunakan kecuali kasus saat ini:
2.) Untuk mengimplementasikan antarmuka, Ketika implementasi antarmuka hanya diperlukan untuk kasus saat ini:
3.) Argument Defined Anonymous inner class:
sumber
Saya menggunakannya kadang-kadang sebagai hack sintaks untuk Instantiation Map:
vs.
Menghemat redundansi saat melakukan banyak pernyataan put. Namun, saya juga mengalami masalah dalam melakukan ini ketika kelas luar perlu diserialisasi melalui remoting.
sumber
Mereka biasanya digunakan sebagai bentuk panggilan balik verbal.
Saya kira Anda bisa mengatakan mereka lebih diuntungkan daripada tidak memilikinya, dan harus membuat kelas bernama setiap saat, tetapi konsep serupa diimplementasikan jauh lebih baik dalam bahasa lain (sebagai penutup atau blok)
Inilah contoh ayunan
Meskipun masih berantakan, itu jauh lebih baik daripada memaksa Anda untuk mendefinisikan kelas bernama untuk setiap pendengar membuang seperti ini (meskipun tergantung pada situasi dan penggunaan kembali, itu mungkin masih merupakan pendekatan yang lebih baik)
sumber
myButton.addActionListener(e -> { /* do stuff here */})
ataumyButton.addActionListener(stuff)
akan terser.Anda menggunakannya dalam situasi di mana Anda perlu membuat kelas untuk tujuan tertentu di dalam fungsi lain, misalnya, sebagai pendengar, sebagai runnable (untuk menelurkan utas), dll.
Idenya adalah bahwa Anda memanggil mereka dari dalam kode fungsi sehingga Anda tidak pernah merujuk mereka di tempat lain, sehingga Anda tidak perlu menyebutkannya. Kompilator hanya menyebutkannya.
Mereka pada dasarnya gula sintaksis, dan umumnya harus dipindahkan ke tempat lain ketika mereka tumbuh lebih besar.
Saya tidak yakin apakah itu salah satu kelebihan Java, meskipun jika Anda menggunakannya (dan kita semua sering menggunakannya, sayangnya), maka Anda bisa berpendapat bahwa itu adalah salah satunya.
sumber
GuideLines untuk Kelas Anonim.
Kelas anonim dideklarasikan dan diinisialisasi secara bersamaan.
Kelas anonim harus diperluas atau diterapkan ke satu dan hanya satu kelas atau antarmuka saja.
Karena kelas anonimouse tidak memiliki nama, kelas ini hanya dapat digunakan sekali.
misalnya:
sumber
ref.getClass().newInstance()
.Ya, kelas batin anonim jelas merupakan salah satu kelebihan Jawa.
Dengan kelas batin anonim Anda memiliki akses ke variabel akhir dan anggota dari kelas sekitarnya, dan itu sangat berguna di pendengar dll.
Tetapi keuntungan utama adalah bahwa kode kelas dalam, yang (setidaknya harus) digabungkan erat dengan kelas / metode / blok di sekitarnya, memiliki konteks spesifik (kelas sekitarnya, metode, dan blok).
sumber
Ini juga salah satu contoh untuk tipe dalam anonim menggunakan utas
sumber
saya menggunakan objek anonim untuk memanggil Thread baru ..
sumber
Sebuah kelas batin dikaitkan dengan sebuah instance dari kelas luar dan ada dua jenis khusus: kelas lokal dan kelas Anonymous . Kelas anonim memungkinkan kita untuk mendeklarasikan dan membuat instance kelas pada saat yang sama, sehingga membuat kode ringkas. Kami menggunakannya ketika kami membutuhkan kelas lokal hanya sekali karena mereka tidak memiliki nama.
Pertimbangkan contoh dari doc di mana kita memiliki
Person
kelas:dan kami memiliki metode untuk mencetak anggota yang cocok dengan kriteria pencarian sebagai:
di mana
CheckPerson
antarmuka seperti:Sekarang kita dapat menggunakan kelas anonim yang mengimplementasikan antarmuka ini untuk menentukan kriteria pencarian sebagai:
Di sini antarmuka sangat sederhana dan sintaksis kelas anonim tampaknya sulit dan tidak jelas.
Java 8 telah memperkenalkan istilah Fungsional Antarmuka yang merupakan antarmuka dengan hanya satu metode abstrak, maka kita dapat mengatakan
CheckPerson
adalah antarmuka fungsional. Kita dapat menggunakan Ekspresi Lambda yang memungkinkan kita untuk melewatkan fungsi sebagai argumen metode sebagai:Kita dapat menggunakan antarmuka fungsional standar
Predicate
sebagai pengganti antarmukaCheckPerson
, yang selanjutnya akan mengurangi jumlah kode yang diperlukan.sumber
Kelas dalam anonim dapat bermanfaat sambil memberikan implementasi yang berbeda untuk objek yang berbeda. Tetapi harus digunakan sangat hemat karena menciptakan masalah untuk keterbacaan program.
sumber
Salah satu penggunaan utama dari kelas anonim dalam finalisasi kelas yang disebut finalizer wali . Di dunia Jawa menggunakan metode penyelesaian harus dihindari sampai Anda benar-benar membutuhkannya. Anda harus ingat, ketika Anda mengganti metode finalisasi untuk sub-kelas, Anda harus selalu memohon
super.finalize()
juga, karena metode finalisasi kelas super tidak akan dipanggil secara otomatis dan Anda dapat mengalami masalah dengan kebocoran memori.jadi mengingat fakta yang disebutkan di atas, Anda bisa menggunakan kelas anonim seperti:
Dengan menggunakan teknik ini, Anda merasa lega dengan diri Anda dan pengembang lain untuk memanggil
super.finalize()
setiap sub-kelasHeavyClass
yang membutuhkan metode penyelesaian.sumber
Anda dapat menggunakan kelas anonim dengan cara ini
sumber
Sepertinya tidak ada yang disebutkan di sini tetapi Anda juga dapat menggunakan kelas anonim untuk mengadakan argumen tipe umum (yang biasanya hilang karena penghapusan tipe) :
Jika Anda akan membuat instance kelas ini dengan cara anonim
lalu seperti itu
holder
instance akan mengandung definisi tipe pass yang tidak dihapus.Pemakaian
Ini sangat berguna untuk membangun validator / deserializator. Anda juga dapat instantiate tipe generik dengan refleksi (jadi jika Anda ingin melakukan
new T()
dalam tipe parametrized - Anda dipersilakan!) .Kekurangan / Keterbatasan
sumber
Cara terbaik untuk mengoptimalkan kode. juga, Kita bisa menggunakan metode kelas atau antarmuka utama.
sumber
Sebuah Anonymous batin Kelas digunakan untuk membuat sebuah objek yang tidak akan pernah dirujuk lagi. Tidak memiliki nama dan dideklarasikan dan dibuat dalam pernyataan yang sama. Ini digunakan di mana Anda biasanya menggunakan variabel objek. Anda mengganti variabel dengan
new
kata kunci, panggilan ke konstruktor dan definisi kelas di dalam{
dan}
.Saat menulis Program Berurutan di Jawa, biasanya akan terlihat seperti ini
Yang
ThreadClass
digunakan di sini akan ditentukan oleh pengguna. Kelas ini akan mengimplementasikanRunnable
antarmuka yang diperlukan untuk membuat utas. DalamThreadClass
saturun()
metode (hanya metode dalamRunnable
) perlu dilaksanakan juga. Jelas bahwa menyingkirkanThreadClass
akan lebih efisien dan itulah mengapa Kelas Batin Anonim ada.Lihatlah kode berikut
Kode ini menggantikan referensi yang dibuat
task
pada contoh paling atas. Alih-alih memiliki kelas terpisah, Kelas Batin Anonim di dalamThread()
konstruktor mengembalikan objek tanpa nama yang mengimplementasikanRunnable
antarmuka dan menggantirun()
metode. Metode inirun()
akan mencakup pernyataan di dalam yang melakukan pekerjaan yang diperlukan oleh utas.Menjawab pertanyaan apakah Anonymous Inner Classes adalah salah satu kelebihan Java, saya harus mengatakan bahwa saya tidak begitu yakin karena saya tidak akrab dengan banyak bahasa pemrograman saat ini. Tapi yang bisa saya katakan adalah metode pengkodean yang lebih cepat dan mudah.
Referensi: Sams Teach Yourself Java dalam Edisi 21 Hari Ketujuh
sumber
Satu lagi keuntungan:
Seperti yang Anda tahu bahwa Java tidak mendukung multiple inheritance, jadi jika Anda menggunakan "Thread" agak kelas sebagai kelas anonim maka kelas masih memiliki satu ruang tersisa untuk kelas lain untuk diperluas.
sumber