Pertanyaan Apa manfaat dari antarmuka Iterator di Jawa?
Saya baru saja belajar tentang bagaimana Java Collections Framework mengimplementasikan struktur data dalam daftar tertaut. Dari apa yang aku mengerti, Iterators
adalah cara melintas melalui item dalam struktur data seperti daftar. Mengapa antarmuka ini digunakan? Mengapa metodenya hasNext()
, next()
dan remove()
tidak langsung dikodekan ke implementasi struktur data itu sendiri?
Dari situs web Java: teks tautan
antarmuka publik Iterator <E>
Sebuah
iterator atas koleksi. Iterator
mengambil tempat Pencacahan di
Kerangka koleksi Java. Iterator
berbeda dari enumerasi dalam dua cara:
- Iterators memungkinkan pemanggil untuk menghapus
elemen dari yang mendasarinya
koleksi selama iterasi dengan
semantik yang terdefinisi dengan baik.
- Nama metode
telah diperbaiki.
Antarmuka ini
anggota dari Koleksi Java
Kerangka.
Saya mencoba googling dan sepertinya tidak dapat menemukan jawaban yang pasti. Dapatkah seseorang menjelaskan mengapa Sun memilih untuk menggunakannya? Apakah karena desain yang lebih baik? Keamanan meningkat? Latihan OO yang baik?
Bantuan apa pun akan sangat dihargai. Terima kasih.
32
2017-09-18 04:01
asal
Jawaban:
Mengapa antarmuka ini digunakan?
Karena mendukung operasi dasar yang akan memungkinkan programmer klien untuk beralih ke koleksi apa pun (catatan: belum tentu a Collection
dalam Object
merasakan).
Mengapa metodenya ... tidak secara langsung
dikodekan ke struktur data
implementasi itu sendiri?
Mereka, mereka hanya ditandai Pribadi sehingga Anda tidak dapat menjangkau ke dalamnya dan berbuat salah dengan mereka. Lebih spesifik:
- Anda dapat mengimplementasikan atau subkelas an
Iterator
sedemikian rupa sehingga melakukan sesuatu yang standar tidak dilakukan, tanpa harus mengubah objek yang sebenarnya iterates over.
- Objek yang dapat dilalui tidak perlu memiliki antarmuka mereka yang berantakan dengan metode traversal, khususnya metode yang sangat khusus.
- Anda dapat membagikan
Iterators
untuk bagaimanapun banyak klien yang Anda inginkan, dan setiap klien dapat melintasi waktu mereka sendiri, dengan kecepatan mereka sendiri.
- Jawa
Iterators
dari paket java.util khususnya akan memberikan pengecualian jika penyimpanan yang mendukungnya dimodifikasi saat Anda masih memiliki Iterator
di luar. Pengecualian ini memungkinkan Anda mengetahui bahwa Iterator
sekarang mungkin mengembalikan objek yang tidak valid.
Untuk program sederhana, tidak ada yang mungkin tampak bermanfaat. Jenis kerumitan yang membuat mereka berguna akan muncul pada Anda dengan cepat.
16
2017-09-18 05:06
Anda bertanya: "Mengapa metode hasNext (), next () dan hapus () tidak langsung dikodekan ke implementasi struktur data itu sendiri?".
Kerangka Java Collections memilih untuk mendefinisikan antarmuka Iterator sebagai eksternalisasi untuk koleksi itu sendiri. Biasanya, karena setiap koleksi Java mengimplementasikan Iterable
antarmuka, program Java akan memanggil iterator
untuk membuat iteratornya sendiri sehingga dapat digunakan dalam satu lingkaran. Seperti yang telah ditunjukkan oleh orang lain, Java 5 memungkinkan kita untuk mengarahkan penggunaan iterator, dengan for-each loop.
Eksternalisasi iterator ke koleksinya memungkinkan klien untuk mengontrol bagaimana satu iterates melalui koleksi. Satu kasus penggunaan yang dapat saya pikirkan di mana ini berguna adalah ketika seseorang memiliki koleksi tak terbatas seperti semua halaman web di Internet untuk diindeks.
Dalam buku klasik GOF, kontras antara iterator internal dan eksternal dibilang cukup jelas.
Masalah mendasar adalah memutuskan pihak mana yang mengendalikan iterasi, iterator atau klien yang menggunakan iterator. Ketika klien mengontrol iterasi, iterator disebut iterator eksternal, dan ketika iterator mengendalikannya, iterator adalah iterator internal. Klien yang menggunakan iterator eksternal harus memajukan traversal dan meminta elemen berikutnya secara eksplisit dari iterator. Sebaliknya, klien menyerahkan iterator internal operasi untuk melakukan, dan iterator menerapkan operasi itu ke setiap elemen ....
Iterator eksternal lebih fleksibel daripada iterator internal. Sangat mudah untuk membandingkan dua koleksi untuk kesetaraan dengan iterator eksternal, misalnya, tetapi praktis tidak mungkin dengan iterator internal ... Tetapi di sisi lain, iterator internal lebih mudah digunakan, karena mereka mendefinisikan logika iterasi untuk Anda.
Untuk contoh bagaimana iterator internal bekerja, lihat Ruby Enumerable
API, yang memiliki metode iterasi internal seperti each
. Di Ruby, idenya adalah untuk melewati blok kode (yaitu penutupan) ke iterator internal sehingga koleksi dapat mengurus iterasi sendiri.
6
2017-09-18 05:22
penting untuk menjaga agar koleksi tetap terpisah dari penunjuk. poin iterator di tempat tertentu dalam koleksi, dan dengan demikian bukan merupakan bagian integral dari koleksi. dengan cara ini, misalnya, Anda dapat menggunakan beberapa iterator melalui koleksi yang sama.
sisi bawah dari pemisahan ini adalah bahwa iterator tidak menyadari perubahan yang dibuat pada koleksi yang diulangnya. jadi Anda tidak dapat mengubah struktur koleksi dan mengharapkan iterator untuk melanjutkan kerjanya tanpa "keluhan".
4
2017-09-18 09:33
Menggunakan Iterator
antarmuka memungkinkan setiap kelas yang mengimplementasikan metodenya untuk bertindak sebagai iterator. Gagasan antarmuka di Jawa adalah, dengan cara, kewajiban kontraktual untuk menyediakan fungsionalitas tertentu di kelas itu implements
antarmuka, untuk bertindak dengan cara yang diperlukan oleh antarmuka. Karena kewajiban kontraktual harus dipenuhi agar menjadi kelas yang valid, kelas-kelas lain yang melihat kelas implements
antarmuka dan dengan demikian diyakinkan untuk mengetahui bahwa kelas akan memiliki fungsi-fungsi tertentu.
Dalam contoh ini, daripada menerapkan metode (hasNext(), next(), remove()
) dalam LinkedList
kelas itu sendiri, yang LinkedList
kelas akan menyatakannya implements
itu Iterator
antarmuka, sehingga orang lain tahu bahwa LinkedList
dapat digunakan sebagai iterator. Pada gilirannya, itu LinkedList
kelas akan menerapkan metode dari Iterator
antarmuka (seperti hasNext()
), sehingga dapat berfungsi seperti iterator.
Dengan kata lain, mengimplementasikan antarmuka adalah gagasan pemrograman berorientasi objek untuk memberi tahu orang lain bahwa kelas tertentu memiliki apa yang diperlukan untuk menjadi apa yang diklaimnya.
Gagasan ini ditegakkan dengan memiliki metode yang harus dilaksanakan oleh kelas yang mengimplementasikan antarmuka. Ini memastikan kelas-kelas lain yang ingin menggunakan kelas yang mengimplementasikan Iterator
antarmuka yang memang akan memiliki metode yang Iterators harus miliki, seperti hasNext()
.
Juga, harus dicatat bahwa karena Java tidak memiliki banyak warisan, penggunaan antarmuka dapat digunakan untuk meniru fitur itu. Dengan mengimplementasikan beberapa antarmuka, seseorang dapat memiliki kelas yang merupakan subkelas untuk mewarisi beberapa fitur, namun juga "mewarisi" fitur yang lain dengan menerapkan antarmuka. Salah satu contohnya adalah, jika saya ingin memiliki subkelas dari LinkedList
kelas yang disebut ReversibleLinkedList
yang bisa iterasi dalam urutan terbalik, saya dapat membuat antarmuka yang disebut ReverseIterator
dan memberlakukan bahwa itu menyediakan previous()
metode. Sejak itu LinkedList
sudah mengimplementasikan Iterator
, daftar reversibel baru akan menerapkan keduanya Iterator
dan ReverseIterator
antarmuka.
Anda dapat membaca lebih lanjut tentang antarmuka dari Apa itu Antarmuka? dari Java Tutorial dari Sun.
3
2017-09-18 04:39
Beberapa contoh interator dapat digunakan secara bersamaan. Dekati mereka sebagai kursor lokal untuk data yang mendasarinya.
BTW: mendukung antarmuka atas implementasi konkret kehilangan kopling
Carilah pola desain iterator, dan di sini: http://en.wikipedia.org/wiki/Iterator
3
2017-09-18 05:32
Karena Anda mungkin melakukan iterasi terhadap sesuatu yang bukan merupakan struktur data. Katakanlah saya memiliki aplikasi jaringan yang menarik hasil dari server. Saya dapat mengembalikan pembungkus Iterator di sekitar hasil tersebut dan streaming mereka melalui kode standar yang menerima objek Iterator.
Anggap saja sebagai bagian penting dari desain MVC yang baik. Data harus mendapatkan dari Model (yaitu struktur data) ke Tampilan entah bagaimana. Menggunakan Iterator sebagai perantara memastikan bahwa penerapan Model tidak pernah diekspos. Anda bisa menyimpan LinkedList di memori, menarik informasi dari algoritma dekripsi, atau membungkus panggilan JDBC. Ini tidak masalah bagi tampilan, karena tampilan hanya peduli tentang antarmuka Iterator.
2
2017-09-18 04:12
Sebuah makalah menarik yang membahas pro dan kontra tentang penggunaan iterator:
http://www.sei.cmu.edu/pacc/CBSE5/Sridhar-cbse5-final.pdf
1
2017-09-18 04:10
Saya pikir itu hanya latihan OO yang baik. Anda dapat memiliki kode yang berhubungan dengan semua jenis iterator, dan bahkan memberi Anda kesempatan untuk membuat struktur data Anda sendiri atau hanya kelas generik yang mengimplementasikan antarmuka iterator. Anda tidak perlu khawatir tentang apa jenis implementasi di belakangnya.
1
2017-09-18 04:11