inicializando un Guava ImmutableMap

3 minutos de lectura

avatar de usuario
usuario903724

Guava ofrece un buen atajo para inicializar un mapa. Sin embargo, aparece el siguiente error del compilador (Eclipse Indigo) cuando mi mapa se inicializa en nueve entradas.

El método of(K, V, K, V, K, V, K, V, K, V) en el tipo ImmutableMap no es aplicable para los argumentos
(String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String)

ImmutableMap<String,String> myMap = ImmutableMap.of(
        "key1", "value1", 
        "key2", "value2", 
        "key3", "value3", 
        "key4", "value4", 
        "key5", "value5", 
        "key6", "value6", 
        "key7", "value7", 
        "key8", "value8", 
        "key9", "value9"
        );

El mensaje parece decir que

Un ImmutableMap tiene un tamaño máximo de cuatro pares de clave, valor.

Obviamente, este no puede ser el caso, pero no sé qué hacer para aumentar el tamaño de mi inicializador.

¿Alguien puede decirme qué falta?

avatar de usuario
jon skeet

Tenga en cuenta que su mensaje de error solo contiene cinco K, V pares, 10 argumentos en total. Esto es por diseño; la clase ImmutableMap proporciona seis diferentes of() métodos, aceptando entre cero y cinco pares clave-valor. no hay un of(...) sobrecarga aceptar un parámetro varags porque K y V pueden ser de diferentes tipos.

quieres un ImmutableMap.Builder:

ImmutableMap<String,String> myMap = ImmutableMap.<String, String>builder()
    .put("key1", "value1") 
    .put("key2", "value2") 
    .put("key3", "value3") 
    .put("key4", "value4") 
    .put("key5", "value5") 
    .put("key6", "value6") 
    .put("key7", "value7") 
    .put("key8", "value8") 
    .put("key9", "value9")
    .build();

  • Gracias por las respuestas rápidas. Decidí probar Guava porque no quería tener que escribir todos los ‘puts’ requeridos por un inicializador de mapa estándar. ¡Demasiado para esa idea!

    – usuario903724

    28 de febrero de 2012 a las 20:59

  • @user903724: La razón principal para usar Guava aquí es la fuerte inmutabilidad, en mi opinión.

    – Jon Skeet

    28 de febrero de 2012 a las 21:09

  • Eso, o el consumo de memoria ligeramente reducido, y la sintaxis del constructor es bastante fluida, a medida que avanzan las cosas.

    – Luis Wasserman

    28 de febrero de 2012 a las 21:19

  • bueno, es posible que aún tenga varias ubicaciones, pero ahora usan una API fluida, por lo que no es necesario repetir myMap para cada .put

    –Kevin Welker

    28 de febrero de 2012 a las 22:25

  • Observe también cómo el código de ejemplo de Jon podría ser un public static final y todavía funciona, no hay necesidad de un método de ayuda o static{} inicializador!

    –Kevin Bourrillion

    29 de febrero de 2012 a las 3:57

avatar de usuario
nathan feger

si el mapa es corto puedes hacer:

ImmutableMap.of(key, value, key2, value2); // ...up to five k-v pairs

Si es más largo entonces:

ImmutableMap.builder()
   .put(key, value)
   .put(key2, value2)
   // ...
   .build();

  • Aparte de la legibilidad, puede utilizar ImmutableMap.of fábrica estática para hasta cinco pares de valores clave. Entonces tienes que usar el constructor.

    – Xerxess

    28 de febrero de 2012 a las 21:06


Si desea un equilibrio entre capacidad y legibilidad, puede combinar ambos enfoques:

ImmutableMap<String,String> myMap = ImmutableMap.<String, String>builder()
    .putAll(ImmutableMap.of(
        "key1", "value1", 
        "key2", "value2", 
        "key3", "value3", 
        "key4", "value4"));
    .putAll(ImmutableMap.of(
        "key5", "value5", 
        "key6", "value6", 
        "key7", "value7", 
        "key8", "value8", 
        "key9", "value9"));
    .build();

Si esto es una buena idea o no, es algo abierto a discusión.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad