Saya mencoba menambahkan objek ke sebuah List<String>
instance tetapi ia melempar UnsupportedOperationException
. Adakah yang tahu mengapa?
Kode Java saya:
String[] membersArray = request.getParameterValues('members');
List<String> membersList = Arrays.asList(membersArray);
for (String member : membersList) {
Person person = Dao.findByName(member);
List<String> seeAlso;
seeAlso = person.getSeeAlso();
if (!seeAlso.contains(groupDn)){
seeAlso.add(groupDn);
person.setSeeAlso(seeAlso);
}
}
Pesan kesalahan:
java.lang.UnsupportedOperationException java.util.AbstractList.add (Sumber Tidak Dikenal) java.util.AbstractList.add (Sumber Tidak Dikenal) javax.servlet.http.HttpServlet.service (HttpServlet.java:641) javax.servlet.http.HttpServlet.service (HttpServlet.java:722)
List<String> listMembres = new ArrayList<String>(Arrays.asList(tabMembres));
:)List
implementasi yang tidak memungkinkan penambahan, maka Anda harus menyalinnyaList
ke implementasi yang tidak (ArrayList
adalah kandidat umum) dan menambahkannya.Banyak dari implementasi Daftar mendukung dukungan terbatas untuk menambah / menghapus, dan Arrays.asList (membersArray) adalah salah satunya. Anda perlu memasukkan catatan di java.util.ArrayList atau menggunakan pendekatan di bawah ini untuk mengubahnya menjadi ArrayList.
Dengan perubahan minimal pada kode Anda, Anda dapat melakukan di bawah ini untuk mengonversi daftar menjadi ArrayList. Solusi pertama adalah memiliki perubahan minimum dalam solusi Anda, tetapi yang kedua lebih dioptimalkan, saya kira.
ATAU
sumber
Bentuk konsep Warisan, Jika beberapa metode pertikular tidak tersedia di kelas saat ini akan mencari metode itu di kelas super. Jika tersedia dijalankan.
Saat Anda mengonversi dari Array ke Obejct Collection. yaitu, berbasis array ke API berbasis koleksi maka ia akan memberi Anda objek koleksi ukuran tetap, karena perilaku Array adalah ukuran tetap.
Sampel souce untuk konformasi.
Bentuk Sumber di atas Anda dapat mengamati bahwa
java.util.Arrays.ArrayList
kelas tidak@Override add(index, element), set(index, element), remove(index)
. Jadi, Dari pewarisan itu menjalankan fungsiAbstractList<E>
kelas superadd()
yang melemparUnsupportedOperationException
.Seperti
AbstractList<E>
kelas abstrak yang menyediakan implementasinya untukiterator() and listIterator()
. Jadi, kita bisa beralih ke objek daftar.Anda bahkan dapat membuat kelas Koleksi ukuran-bentuk array tetap
Collections.unmodifiableList(list);
Sumber sampel:
A
Collection
- kadang-kadang disebut wadah - hanyalah sebuah objek yang mengelompokkan beberapa elemen menjadi satu unit. Koleksi digunakan untuk menyimpan, mengambil, memanipulasi, dan mengkomunikasikan data agregat.@Lihat juga
vs
HashTablesumber
Anda harus menginisialisasi Daftar Anda, lihat juga:
atau
sumber
UnsupportedOperationException
dalamadd()
. Anda akan mendapatkan NPE sebagai gantinya.Daftar membersList = Arrays.asList (membersArray);
mengembalikan daftar yang tidak dapat diubah, yang perlu Anda lakukan adalah
ArrayList baru <> (Arrays.asList (membersArray)); untuk membuatnya bisa berubah
sumber
alih-alih menggunakan add () kita bisa menggunakan addall ()
add menambahkan satu item, sementara addAll menambahkan setiap item dari koleksi satu per satu. Pada akhirnya, kedua metode mengembalikan true jika koleksi telah dimodifikasi. Dalam kasus ArrayList hal ini sepele, karena koleksi selalu dimodifikasi, tetapi koleksi lain, seperti Set, dapat mengembalikan false jika item yang ditambahkan sudah ada di sana.
sumber
Anda tidak dapat mengubah hasil dari kueri LDAP. Masalah Anda ada di baris ini:
Daftar seeAlso tidak dapat dimodifikasi.
sumber