joiner google for cache java collections apache-commons guava

java - for - Google Guava vs. Apache Commons



guava google core libraries for java (5)

Estaba buscando una implementación de mapa bidireccional en Java, y encontré estas dos bibliotecas:

Ambos son gratuitos, tienen la implementación del mapa bidireccional que estaba buscando (BidiMap en Apache, BiMap en Google), son increíblemente casi del mismo tamaño (Apache 493 kB, Google 499 kB) [ed .: ya no es cierto!] Y parecen en todos los sentidos bastante similar a mí.

¿Cuál debería elegir, y por qué? ¿Existen otras alternativas equivalentes (deben ser gratuitas y tener al menos el mapa bidireccional)? Estoy trabajando con la última versión de Java SE, por lo que no es necesario limitar artificialmente a Java 5 ni nada de eso.


Desde las preguntas frecuentes : Google Collections FAQ

¿Por qué Google construyó todo esto, cuando podría haber intentado mejorar las colecciones de Apache Commons?

Las colecciones de Apache Commons muy claramente no satisfacían nuestras necesidades. No utiliza genéricos, lo cual es un problema para nosotros, ya que odiamos obtener advertencias de compilación de nuestro código. También ha estado en un "patrón de espera" durante mucho tiempo. Podríamos ver que requeriríamos una gran inversión de nuestra parte para solucionarlo hasta que estemos contentos de usarlo, y mientras tanto, nuestra propia biblioteca ya estaba creciendo orgánicamente.

Una diferencia importante entre la biblioteca de Apache y la nuestra es que nuestras colecciones cumplen fielmente con los contratos especificados por las interfaces JDK que implementan. Si revisa la documentación de Apache, encontrará innumerables ejemplos de violaciones. Se merecen crédito por señalarlos con tanta claridad, pero aún así, ¡desviarse del comportamiento de recolección estándar es arriesgado! Debes tener cuidado con lo que haces con tal colección; Los bichos siempre están esperando a suceder.

Nuestras colecciones están totalmente generadas y nunca violan sus contratos (con excepciones aisladas, donde las implementaciones de JDK han establecido un sólido precedente para las violaciones aceptables). Esto significa que puede pasar una de nuestras colecciones a cualquier método que espere una Colección y sentirse bastante seguro de que las cosas funcionarán exactamente como deberían.


En mi opinión, la mejor opción es la guayaba (antes conocida como colecciones de Google):

  • Es más moderno (tiene genéricos).
  • Sigue absolutamente los requisitos de la API de colecciones.
  • se mantiene activamente
  • CacheBuilder y su predecesor MapMaker son simplemente increíbles

Apache Commons Collections también es una buena biblioteca, pero en mi opinión no ha proporcionado una versión habilitada para genéricos (lo que es un inconveniente importante para una API de colecciones) y, en general, parece estar en un estado de mantenimiento / no-hacer Modo de demasiado trabajo en él. Recientemente, Commons Commons Collections ha recuperado algo de vapor nuevamente, pero tiene que ponerse al día. .

Si el tamaño de descarga / huella de memoria / tamaño de código es un problema, entonces las Colecciones Apache Commons podrían ser un mejor candidato, ya que es una dependencia común de otras bibliotecas. Por lo tanto, su uso en su propio código también podría hacerse sin agregar dependencias adicionales. Edición: esta "ventaja" en particular ha sido subvertida parcialmente hasta ahora, ya que muchas bibliotecas realmente dependen de Guava y no de Apache Commons Collections.


Las cosas más importantes que he encontrado que hacen de Google Collections el lugar para comenzar:

  • Genéricos (Colecciones sin Genéricos - FTL)
  • Consistencia con el marco de Colecciones (Josh Bloch fue un jugador clave en este marco)
  • Exactitud. Estos muchachos están desesperadamente ligados a resolver este problema; tienen algo como pruebas de unidad de 25K, y están ligados a obtener el API correcto.

Aquí hay un gran video en Youtube de una charla que dio el autor principal y él hace un buen trabajo al discutir lo que vale la pena saber acerca de esta biblioteca.


Otras dos cosas (espero que no me equivoque)

  • La licencia de Guayaba (nuevo nombre para las colecciones de Google) es la Licencia Apache 2.0, que significa: la misma que para el proyecto Apache Commons
  • No puedo encontrar el código fuente de Guava en un archivo para descargar (parece que solo es posible un acceso a git)

Una cosa desagradable acerca de la guayaba es que Multimap no extiende java.util.Map. Si tiene sus propios métodos que funcionan en Maps, no funcionarán en Guava Multimaps (la interfaz de Apache MultiMap extiende java.util.Map). Estoy seguro de que hay una buena razón por la que es así, pero también es inconveniente.