¿Cuáles son algunas de las situaciones en las que puedo usar Collections.emptyMap()
? La documentación dice que puedo usar este método si quiero que mi colección sea inmutable.
¿Por qué querría una colección vacía inmutable? ¿Cual es el punto?
java
collections
Vinoth Kumar CM
fuente
fuente
[NSArray array]
, devuelve un objeto que, aunque no es utilizable, existe. Entonces puedes jugar con él como un objeto normal y no obtener un error.Respuestas:
De Effective Java , artículo # 43 -
"Return empty arrays or collections, not null"
demuestra devolver una colección vacía y quizás incluso demuestra el uso de estosemptyList()
,emptySet()
yemptyMap()
los métodos de la clase de las Colecciones de obtener una colección vacía que también tiene el beneficio adicional de ser inmutable. Del artículo # 15"Minimize Mutability"
.De Colecciones-emptySet-Collections-emptyList-Collections
Nota: El siguiente código es solo un ejemplo (cámbielo según su caso de uso):
Estos métodos ofrecen un par de ventajas:
Son más concisos porque no es necesario que escriba explícitamente el tipo genérico de la colección; generalmente solo se infiere del contexto de la llamada al método.
Son más eficientes porque no se molestan en crear nuevos objetos; simplemente reutilizan un objeto vacío e inmutable existente. Este efecto generalmente es muy leve, pero ocasionalmente (bueno, rara vez) es importante.
fuente
Set
yHashSet
en sus ejemplos, ya que el punto principal delemptySet()
método y sus amigos (a diferencia de las constantes,Collections.EMPTY_SET
etc.) es que juegan muy bien con los genéricos. Además, el uso de una función (tipos sin formato) que ha quedado en desuso desde Java 5 no es una buena ayuda para la enseñanza.Collection
lugar denull
evitarExceptions
ser arrojado a las siguientes operaciones? Usar una colección inmutable solo resultaría en algún otro tipo de excepción que imagino. Y la asignaciónnull
es ciertamente no menos eficiente que la asignación de una constante inmutable.public boolean setExists() { return !myset.equals(Collections.emptySet()); }
Es, en mi experiencia personal, ciertamente, muy útil en los casos en que una API requiere una colección de parámetros, pero no tiene nada que proporcionar. Por ejemplo, puede tener una API que se parece a esto, y no permite referencias nulas:
Si tiene una consulta que no toma ningún parámetro, sin duda es un poco despilfarrador crear un HashMap, que implica la asignación de una matriz, cuando simplemente puede pasar el 'Mapa vacío', que es efectivamente una constante, la forma en que se implementa en
java.util.Collections
.fuente
Aquí hay dos conceptos diferentes que parecen extraños cuando se ven juntos. Tiene más sentido cuando trata los dos conceptos por separado.
En primer lugar, debe preferir usar una colección inmutable en lugar de una colección mutable siempre que sea posible. Los beneficios de la inmuablidad están bien documentados en otros lugares .
En segundo lugar, debe preferir usar una colección vacía en lugar de usar null como centinela. Esto está bien descrito aquí . Significa que tendrá un código mucho más limpio y fácil de entender, con menos lugares para esconder errores.
Entonces, cuando tiene un código que requiere un mapa, es mejor pasar un mapa vacío en lugar de un nulo para indicar la ausencia de un mapa. Y la mayoría de las veces cuando usa un mapa, es mejor usar un mapa inmutable. Por eso hay una función conveniente para hacer un mapa vacío inmutable.
fuente
Hay un par de casos en los que preferiría usar mapas, listas, conjuntos u otros tipos de colecciones inmutables.
El primer y posiblemente el caso de uso más importante es cuando devuelve un resultado de una consulta o un cálculo que devolvería un conjunto (o lista o mapa) de resultados, debería preferir utilizar estructuras de datos inmutables.
En este caso, prefiero devolver versiones inmutables de estos, ya que esto refleja la inmutabilidad objetiva de un conjunto de resultados de un cálculo mucho más claro: no importa lo que haga con los datos más adelante, el conjunto de resultados que recibió de su consulta no debería cambio.
El segundo caso de uso común es cuando necesita proporcionar un argumento como entrada para un método o servicio. A menos que espere que la colección de entrada sea modificada por el servicio o método (que generalmente es una idea de diseño realmente mala), pasar una colección inmutable en lugar de una mutable podría ser la opción razonable y segura en muchos casos.
Lo considero una convención de "pasar por valor" .
En términos más generales , es una práctica sensata utilizar estructuras de datos inmutables cuando los datos cruzan los límites del módulo o servicio. Esto hace que sea mucho más fácil razonar sobre las diferencias entre la entrada / salida (inmutable) y el estado interno mutable.
Como un efecto secundario muy beneficioso de esto es una mayor seguridad y seguridad de subprocesos de sus módulos / servicios y garantiza una separación más limpia de las preocupaciones.
Otra buena razón para usar
Collections.empty*()
métodos es su notable falta de verbosidad. En la era anterior a Java7, si tenía una colección genérica, tenía que rociar anotaciones de tipo genérico por todas partes.Simplemente compare estas dos declaraciones:
versus:
Este último claramente gana claramente la legibilidad de dos maneras importantes:
fooBarMap
se le está asignando otro valor no vacío simplemente buscando/fooBarMap =/
.fuente
Por un lado, puede salirse con la suya compartiendo referencias. Un
new HashMap()
etc. requerirá un objeto asignado y posiblemente algunos elementos adicionales para contener los datos, pero solo necesita una copia de una colección vacía inmutable (lista, conjunto, mapa o cualquier otro). Esto lo convierte en una opción obvia cuando un método al que está llamando necesita aceptar un Mapa pero no necesita editarlo.Sugiero revisar el Java efectivo de Josh Bloch , que enumera algunos atributos muy agradables de objetos inmutables (incluida la seguridad de subprocesos).
fuente
Puede ser útil cuando tiene una función que devuelve
immutable collection
y, en alguna situación, no hay datos que devolver, por lo que en lugar de regresarnull
, puede regresaremptyMap()
Facilita tu código y evita
NullPointerException
fuente
La mayoría de las veces usamos a
constructor
para crear uno nuevoempty map
. PeroCollections
methods
ofrecen un par de ventajas para crear unempty map
usostatic
method
java.util.Collections.emptyMap()
fuente
Por la misma razón que usarías
Collections.unmodifiableMap()
en algún momento. Desea devolver una instancia de Map que arroje una excepción si el usuario intenta modificarla. Es solo un caso especial: el Mapa vacío.fuente
Por las mismas razones por las cuales podrías querer objetos inmutables. Principalmente porque puedes dormir seguro por la noche sabiendo que varios hilos pueden acceder a la misma instancia de un objeto y que todos verán los mismos valores. No tener elementos en una colección sigue siendo un valor válido, que desea mantener.
fuente