Код: Выделить всё
static List of(E e1, E e2, E e3) {
return new ImmutableCollections.ListN(e1, e2, e3);
}
Код: Выделить всё
@SafeVarargs
@SuppressWarnings("varargs")
static List of(E... elements) {
switch (elements.length) { // implicit null check of elements
case 0:
return ImmutableCollections.emptyList();
case 1:
return new ImmutableCollections.List12(elements[0]);
case 2:
return new ImmutableCollections.List12(elements[0], elements[1]);
default:
return new ImmutableCollections.ListN(elements);
}
}
Код: Выделить всё
@SafeVarargs
ListN(E... input) {
// copy and check manually to avoid TOCTOU
@SuppressWarnings("unchecked")
E[] tmp = (E[])new Object[input.length]; // implicit nullcheck of input
for (int i = 0; i < input.length; i++) {
tmp[i] = Objects.requireNonNull(input[i]);
}
elements = tmp;
}
поэтому перегруженные версии, такие как List.of(E e1, E e2, E e3) были созданы, чтобы не создавать массив внутри.
Однако было подтверждено, что перегруженная версия также создает массив внутри при вызове ListN, который получает переменную аргументы в качестве параметров.
Итак, почему была создана перегруженная версия с размером списка больше 3?
Подробнее здесь: https://stackoverflow.com/questions/757 ... e-elements