Apa perbedaan antara Collections.emptyList () dan Collections.EMPTY_LIST

105

Di Jawa, kami memiliki Collections.emptyList () dan Collections.EMPTY_LIST . Keduanya memiliki sifat yang sama:

Mengembalikan daftar kosong (tidak dapat diubah). Daftar ini dapat diserialkan.

Jadi apa perbedaan persis antara menggunakan yang satu atau yang lain?

poitroae
sumber

Jawaban:

130
  • Collections.EMPTY_LIST mengembalikan gaya lama List
  • Collections.emptyList() menggunakan tipe-inferensi dan karena itu mengembalikan List<T>

Collections.emptyList () telah ditambahkan di Java 1.5 dan mungkin selalu lebih disukai . Dengan cara ini, Anda tidak perlu membuang-buang kode.

Collections.emptyList()secara intrinsik melakukan pemeran untuk Anda .

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
poitroae
sumber
1
Saya tidak 100% yakin akan hal ini, tetapi saya percaya bahwa menggunakan / mengembalikan versi yang tidak diketik (EMPTY_LIST / EMPTY_SET / EMPTY_MAP) menyebabkan kompilator menyerah pada pemeriksaan jenis generik dalam rantai panggilan yang diberikan. Ini pada dasarnya menggambarkan bahwa ia telah mengembara ke kode lama yang tidak memiliki tipe generik dan menyerah.
Matt Passell
18

Mari kita ke sumbernya:

 public static final List EMPTY_LIST = new EmptyList<>();

dan

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
NimChimpsky
sumber
13

Mereka adalah objek yang benar-benar sama.

public static final List EMPTY_LIST = new EmptyList<>();

public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

Satu-satunya adalah yang emptyList()mengembalikan generik List<T>, sehingga Anda dapat menetapkan daftar ini ke koleksi generik tanpa peringatan apa pun.

Andremoniy
sumber
13

Dengan kata lain, EMPTY_LIST bukan tipe aman:

  List list = Collections.EMPTY_LIST;
  Set set = Collections.EMPTY_SET;
  Map map = Collections.EMPTY_MAP;

Jika dibandingkan dengan:

    List<String> s = Collections.emptyList();
    Set<Long> l = Collections.emptySet();
    Map<Date, String> d = Collections.emptyMap();
mel3kings
sumber