Asegurar atómicamente una entrada de ConcurrentMap

En Java, a menudo necesito obtener perezosamente una entrada de un ConcurrentMap, creando solo si es necesario.

Por ejemplo, puedo tener

ConcurrentMap<String, AtomicReference<Something>> a = new ConcurrentHashMap<>();
ConcurrentMap<String, Something> b = new ConcurrentHashMap<>();

Quería hacer una función genérica para hacer este trabajo para no repetirme el código de verificación doble bastante engorroso para cada tipo.

lo siguiente fue hasta donde puedo llegar:

<K, V, C extends V> V ensureEntry(ConcurrentMap<K, V> map, K key, Class<? super C> clazz) throws Exception {
    V result = map.get(key);
    if (result == null) {
        final V value = (V)clazz.newInstance();
        result = map.putIfAbsent(key, value);
        if (result == null) {
            result = value;
        }
    }
    return result;
}

Y luego puedo usarlo como:

AtomicReference<Something> ref = ensureElement(a, "key", AtomicReference.class);
Something something = ensureElement(b, "another key", Something.class);

La pregunta es que: la función está bastante sucia y todavía tiene un reparto de clase genérico inseguro (the (V)). ¿Sería posible uno completamente genérico y más limpio? tal vez en Scala?

¡Gracias!

Respuesta 1

Estoy ejecutando una aplicación de prueba de Grails todo el día con mi aplicación y está bien. Escribo "grails prod war" para obtener una guerra, y la vuelco en la carpeta webapps de mi instalación de tomcat. Ahora recibo el mensaje como ...

Archivo de archivo; FileOutputStream fileOutputStream; Intento final mainIntent = nuevo intento (Intent.ACTION_MAIN, nulo); mainIntent.addCategory (Intent.CATEGORY_LAUNCHER); lista final ...

Tengo el siguiente programa Java y no quiero que se asigne "," después de mi último elemento, ¿qué hacer? Rango de cadena = "400-450"; Entero startRange = null; Entero endRange = nulo; ...

Necesito analizar un archivo de texto sin formato que tenga un elemento para cada línea y campos delimitados por tabuladores. ¿Cómo puedo detectar un espacio de tabulación y símbolos de marcado de la siguiente línea de un documento de texto sin formato? Estaba pensando en usar ...