Мы можем видеть это наоборот.Очевидно, что вызывающий этот метод не должен принимать изменяемый список, так как в противном случае возвращение неизменяемого списка не будет работать.
Затем возвращается тот факт, что в некоторых обстоятельствах фактически изменяемый ArrayList
возвращается, чтоне обеспечивает неизменность, это оптимизация.
Это не так уж и много, учитывая
private static Collection<Cheese> getCheesesOld() {
if(cheesesInStock.isEmpty()) {
return Collections.emptyList();
}
return Collections.unmodifiableList(new ArrayList<>(cheesesInStock));
}
, который только добавляет небольшие накладные расходы, с точки зрения производительности или с точки зрения разработки / сопровождения кода,Три строки кода, специфичные для обработки пустых списков, весят больше.
Но вы все еще можете чувствовать себя некомфортно, возвращая три новых обернутых объекта в случае пустого списка, если вы удалите специальную обработку при возвратеобщий объект будет достаточно.Это чувство может сохраняться, даже если вы понимаете, что сценарий почти никогда не происходит, то есть когда список почти никогда не бывает пустым при вызове метода.
К счастью, в последних версиях Java есть простое решение.Вы можете использовать
private static Collection<Cheese> getCheesesOld() {
return List.copyOf(cheesesInStock);
}
с Java 10 или новее.Возвращаемый список является неизменным, но не является списком, заключенным в другой объект защиты, и он будет иметь оптимизированные версии не только для пустых списков, но и для списков небольших размеров, для которых разработчики JRE сочли это полезным.
Этотакже достаточно умен, чтобы не выполнять фактическую операцию копирования, если источник уже является неизменяемым списком, что подразумевает, что использование того же метода для создания защитных копий входящих списков окупится, когда они уже будут копиями, сделанными такими методами получения.
Вам нужно только справиться с новой обработкой null
, то есть радикальным отклонением null
элементов.