List.copyOf
➙ daftar tidak dapat diverifikasi
Kamu bertanya:
Apakah tidak ada cara lain untuk menetapkan salinan daftar
Java 9 membawa List.of
metode untuk menggunakan literal untuk membuat List
kelas konkret yang tidak dapat dimodifikasi .
LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
List< LocalDate > dates = List.of(
today.minusDays( 1 ) , // Yesterday
today , // Today
today.plusDays( 1 ) // Tomorrow
);
Bersamaan dengan itu kami juga mendapat List.copyOf
. Metode ini juga mengembalikan List
kelas konkrit yang tidak dapat dimodifikasi .
List< String > colors = new ArrayList<>( 4 ) ; // Creates a modifiable `List`.
colors.add ( "AliceBlue" ) ;
colors.add ( "PapayaWhip" ) ;
colors.add ( "Chartreuse" ) ;
colors.add ( "DarkSlateGray" ) ;
List< String > masterColors = List.copyOf( colors ) ; // Creates an unmodifiable `List`.
Yang dimaksud dengan "tidak dapat dimodifikasi" adalah jumlah elemen dalam daftar, dan referensi objek yang disimpan di setiap slot sebagai elemen, diperbaiki. Anda tidak dapat menambah, menjatuhkan, atau mengganti elemen. Tetapi referensi objek yang dipegang di setiap elemen bisa berubah atau tidak bisa berubah .
colors.remove( 2 ) ; // SUCCEEDS.
masterColors.remove( 2 ) ; // FAIL - ERROR.
Lihat kode ini berjalan langsung di IdeOne.com .
Date.toString (): [2020-02-02, 2020-02-03, 2020-02-04]
colors.toString (): [AliceBlue, PapayaWhip, DarkSlateGray]
masterColors.toString (): [AliceBlue, PapayaWhip, Chartreuse, DarkSlateGray]
Anda bertanya tentang referensi objek. Seperti yang dikatakan orang lain, jika Anda membuat satu daftar dan menetapkannya ke dua variabel referensi (pointer), Anda hanya memiliki satu daftar. Keduanya menunjuk ke daftar yang sama. Jika Anda menggunakan salah satu pointer untuk mengubah daftar, kedua pointer nantinya akan melihat perubahan, karena hanya ada satu daftar di memori.
Jadi, Anda perlu membuat salinan daftar. Jika Anda ingin salinan itu tidak dapat dimodifikasi, gunakan List.copyOf
metode seperti yang dibahas dalam Jawaban ini. Dalam pendekatan ini, Anda berakhir dengan dua daftar terpisah, masing-masing dengan elemen yang memegang referensi ke objek konten yang sama. Sebagai contoh, dalam contoh kami di atas menggunakan String
objek untuk mewakili warna, objek warna melayang-layang di memori di suatu tempat. Kedua daftar memegang pointer ke objek warna yang sama. Ini adalah diagram.
Daftar pertama colors
dapat dimodifikasi. Ini berarti bahwa beberapa elemen dapat dihapus seperti yang terlihat dalam kode di atas, di mana kami menghapus elemen ke-3 asli Chartreuse
(indeks 2 = ordinal 3). Dan elemen dapat ditambahkan. Dan elemen-elemen dapat diubah untuk menunjuk ke yang lain String
seperti OliveDrab
atauCornflowerBlue
.
Sebaliknya, keempat elemen tersebut masterColors
adalah tetap. Tidak menghapus, tidak menambahkan, dan tidak mengganti warna lain. Itu List
implementasi unmodifiable.