Jawaban:
Perbedaan utama adalah bahwa Collections.emptyList()
mengembalikan daftar yang tidak dapat diubah , yaitu daftar yang Anda tidak dapat menambahkan elemen. (Hal yang sama berlaku untuk yang List.of()
diperkenalkan di Jawa 9.)
Dalam kasus yang jarang terjadi di mana Anda tidak ingin mengubah daftar kembali, Collections.emptyList()
dan List.of()
dengan demikian tidak seorang pilihan yang baik.
Saya akan mengatakan bahwa mengembalikan daftar yang tidak dapat diubah adalah baik-baik saja (dan bahkan cara yang disukai) selama kontrak (dokumentasi) tidak secara eksplisit menyatakan berbeda.
Selain itu, emptyList()
mungkin tidak membuat objek baru dengan setiap panggilan.
Implementasi metode ini tidak perlu membuat objek Daftar terpisah untuk setiap panggilan. Menggunakan metode ini cenderung memiliki biaya yang sebanding dengan menggunakan bidang seperti-bernama. (Tidak seperti metode ini, bidang tidak menyediakan keamanan tipe.)
Implementasi emptyList
tampilannya sebagai berikut:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
Jadi jika metode Anda (yang mengembalikan daftar kosong) disebut sangat sering, pendekatan ini bahkan dapat memberi Anda kinerja yang sedikit lebih baik baik dari segi CPU dan memori.
NullPointerException
dengan kembali Collections.emptyList()
sebagai gantinya null
.
Collections.emptyList()
iterable dan mengembalikan panjang, sehingga dapat digunakan untuk loop tanpa kecuali dilemparkan.
new ArrayList<>()
itu juga membuat keputusan desain jelas; elemen tidak akan ditambahkan ke daftar ini.
Dimulai dengan Java 5.0 Anda dapat menentukan jenis elemen dalam wadah:
Collections.<Foo>emptyList()
Saya setuju dengan tanggapan lain bahwa untuk kasus di mana Anda ingin mengembalikan daftar kosong yang tetap kosong, Anda harus menggunakan pendekatan ini.
List<Foo> list = Collections.emptyList()
Collections.emptyList
tidak berubah sehingga ada perbedaan antara kedua versi sehingga Anda harus mempertimbangkan pengguna dari nilai yang dikembalikan.
Kembali new ArrayList<Foo>
selalu menciptakan contoh baru objek sehingga memiliki biaya tambahan yang sangat sedikit yang terkait dengannya yang dapat memberi Anda alasan untuk menggunakannya Collections.emptyList
. Saya suka menggunakan emptyList
hanya karena lebih mudah dibaca.
Berhati-hatilah. Jika Anda kembali Collections.emptyList()
dan kemudian mencoba melakukan beberapa perubahan dengan suka add()
atau pertengkaran seperti itu, Anda akan memiliki UnsupportedOperationException()
karena Collections.emptyList()
mengembalikan objek yang tidak dapat diubah.
Saya akan pergi dengan Collections.emptyList()
jika daftar yang dikembalikan tidak diubah dengan cara apa pun (karena daftar tidak berubah), kalau tidak saya akan pergi dengan opsi 2.
Manfaatnya Collections.emptyList()
adalah bahwa instance statis yang sama dikembalikan setiap kali dan sehingga tidak ada pembuatan instance yang terjadi untuk setiap panggilan.
Gunakan Collections.emptyList () jika Anda ingin memastikan bahwa daftar yang dikembalikan tidak pernah dimodifikasi. Inilah yang dikembalikan saat memanggil blankList ():
/**
* The empty list (immutable).
*/
public static final List EMPTY_LIST = new EmptyList();
Collections.emptyList()
memiliki biaya konstruksi. Melihat detail implementasi (walaupun mungkin tidak sama pada semua JVM) mengkonfirmasi bahwa itu tidak. @ Amul, dari mana JVM ini?
Jawaban yang diberikan menekankan fakta bahwa emptyList()
mengembalikan yang kekal List
tetapi tidak memberikan alternatif. Kasus ArrayList(int initialCapacity)
khusus Constructor 0
jadi kembali dan new ArrayList<>(0)
bukan new ArrayList<>()
juga bisa menjadi solusi yang layak:
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
[...]
/**
* Constructs an empty list with the specified initial capacity.
*
* @param initialCapacity the initial capacity of the list
* @throws IllegalArgumentException if the specified initial capacity
* is negative
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
(sumber dari Java 1.8.0_72)
Collections.emptyList()
lebih cocok untuk katakanlah, pengecekan error dan sejenisnya?