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