
Сделав следующее:
List<User> users = Collections.emptyList();
Тип возвращаемого списка от Collections.emptyList(); будет предполагаемый как String из-за левой части назначения. Однако, если вы предпочитаете не делать этого вывода, вы можете определить его явно, выполнив следующие действия:
List<User> users = Collections.<User>emptyList();
В данном конкретном случае для большинства людей это может показаться избыточным (на самом деле, я видел очень мало кода, который использует явные аргументы типа), однако для метода с подписью: void doStuff(List<String> users) это было бы идеально clean для того, чтобы вызвать doStuff() с явным аргументом типа следующим образом:
doStuff(Collections.<String>emptyList());
List<User> users = Collections.emptyList();
После создания пустого списка я бы рекомендовал сохранить его как константу, а не создавать каждый раз новый.
Кроме того, использование Collections.emptyList() по сравнению с new ArrayList(0) дает преимущества в производительности, хотя разница, вероятно, небольшая. Список, возвращаемый функцией emptyList (), оптимизирован, чтобы быть неизменяемым пустым списком. Например, метод size () просто возвращает 0, а не поиск по полю или что-то еще, что делает ArrayList.
каждый раз, когда вы записываете явный аргумент типа в метод, бог убивает котенка (я думаю, что это сказал Джош Блох)