Яка різниця між Collections.emptyList () та Collections.EMPTY_LIST


105

На Java у нас є Collections.emptyList () та Collections.EMPTY_LIST . Обидва мають однакову властивість:

Повертає порожній список (незмінний). Цей список є серійним.

Тож у чому полягає точна різниця між використанням того чи іншого?

Відповіді:


130
  • Collections.EMPTY_LIST повертає старий стиль List
  • Collections.emptyList() використовує висновок типу і тому повертається List<T>

Collections.emptyList () було додано в Java 1.5 і, ймовірно, завжди бажано . Таким чином, вам не потрібно зайве обмінюватись кодом.

Collections.emptyList()по суті робить акторський склад для вас .

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

1
Я не на 100% впевнений у цьому, але вважаю, що використання / повернення нетипізованої версії (EMPTY_LIST / EMPTY_SET / EMPTY_MAP) змушує компілятора відмовитися від перевірки типу дженерики в межах даного ланцюжка викликів. Це, по суті, зрозуміло, що він проник до старого коду, якому бракує загальних типів, і здається
Метт Пассел

18

Дозволяємо дістатися до джерела:

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

і

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

13

Вони абсолютно рівні об’єкти.

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

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

Єдине, що emptyList()повертає загальний характер List<T>, тому ви можете призначити цей список для загальної колекції без будь-яких попереджень.


13

Іншими словами, EMPTY_LIST не є безпечним типом:

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

Порівняно з:

    List<String> s = Collections.emptyList();
    Set<Long> l = Collections.emptySet();
    Map<Date, String> d = Collections.emptyMap();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.