Существует ли разница между Map.of()
и Collections.emptyMap()
между List.of()
и Collections.emptyList()
и между Set.of()
и Collections.emptySet()
?
Map.of() vs. Collections.emptyMap()
Ответ 1
Да, существуют даже поведенческие, а не только технические различия между коллекциями, возвращаемыми методами emptyXyz
factory в классе Collections
и новыми методами of
factory введенные в интерфейсы (Map
, List
, Set
) с JDK 9, если они вызываются без аргументов.
Соответствующее различие заключается в том, что коллекции, возвращаемые новыми методами of
factory, запрещают null
ключи и значения (как указано в документации API в List, Set и Map). Это может звучать безотносительно к пустым коллекциям, но даже если это не совсем четко документировано, даже методы доступа в новых реализациях коллекции проверяют нулевые значения.
Некоторые примеры различий:
Collections.emptyList().contains(null)
вернет false, а List.of().contains(null)
выкинет NullPointerException
.
Collection.emptyMap().getOrDefault(null, V)
вернет V
, а Map.of().getOrDefault(null, V)
выкинет NullPointerException
.
Как в настоящее время реализовано в Oracle JDK 9, по крайней мере, следующие методы в коллекциях, возвращаемые новыми методами factory, будут бросать NullPointerException
s, но вести себя "безопасно" (как в том, как изначально были разработаны классы коллекции для поддержки нулевых ключей и значений), используя старые методы factory в классе Collections
:
-
List.of().contains(null);
-
Set.of().contains(null);
-
Map.of().containsKey(null);
-
Map.of().containsValue(null);
-
Map.of().getOrDefault(null, <any>);