The Javadoc untuk ListIterator mengatakan:
A
ListIterator
tidak memiliki elemen saat ini; posisi kursornya selalu terletak di antara elemen yang akan dikembalikan oleh panggilan keprevious()
dan elemen yang akan dikembalikan oleh panggilan kenext()
.
Mengapa Java ListIterator
diterapkan untuk menunjuk antara elemen daripada elemen saat ini? Tampaknya ini membuat kode klien kurang dibaca ketika telah berulang kali memanggil getNext()
, getPrevious()
, jadi saya berasumsi harus ada alasan yang baik untuk pilihan.
Sebagai catatan, saya hanya menulis sedikit perpustakaan yang disebut peekable-arraylist yang meluas ArrayList
, Iterator
dan ListIterator
yang menyediakan peekAtNext()
dan peekAtPrevious()
metode diimplementasikan seperti:
@Override public synchronized T peekAtNext() {
T t = next();
previous();
return t;
}
Jawaban:
Sejauh yang saya tahu, alasannya dapat ditemukan di bagian javadoc yang tidak Anda kutip (penekanan di bawah tambang):
Anda lihat, tujuan yang dimaksudkan adalah untuk memungkinkan penggunaan saat daftar sedang dimodifikasi. Kemungkinan modifikasi ternyata termasuk penghapusan elemen.
Sekarang pikirkan apa yang akan terjadi jika kita menghapus elemen yang akan
current()
untuk iterator - dengan asumsi iterator akan memiliki gagasan tentang elemen saat ini? Dalam konteks ini, cara untuk mengimplementasikannya tanpa gagasan tentang elemen saat ini cukup masuk akal bagi saya - karena dengan begitu, iterator tidak perlu khawatir tentang penghapusan elemen.Hal ini penting untuk dicatat bahwa javadoc tidak memerlukan implementasi antarmuka untuk thread aman.
Apa yang ListIterator sanggup, adalah menangani modifikasi yang dilakukan dari utas yang sama saat iterasi. Tidak semua iterator seperti itu, javadocs ConcurrentModificationException secara khusus memperingatkan tentang ini:
sumber
insertBefore
daninsertAfter
, meskipun itu bukan masalah besar sepertiremove
.next()
?remove()
akansynchronized
seperti itugetCurrent()
. Apakah saya melewatkan sesuatu?ArrayList
untuk mencapai ini.