Está actualizando el valor de un mapa mediante la mutación de su práctica mala referencia?

huevos:

Tengo un código similar a esto todo alrededor de una base de código que estoy trabajando en:

Map<String, Map<Object, Integer>> mapOfMap = new HashMap<>();

Map<Object, Integer> mapA = mapOfMap.computeIfAbsent(keyParam, k -> new HashMap<>());
mapA.put(objectParam, mapA.getOrDefault(objectParam, 0) + 1);

De esta manera, hemos actualizado el valor de 'keyParam' en el primer mapa sin una llamada directa al método put ().

Yo tiendo a preferir cuando el código es explícita y típicamente escribir una llamada normal a 'put'. Sin embargo, me pregunto si estoy pensando demasiado y esto concisión es algo que ganamos por tener referencias a objetos? ¿Puede esto ser escrito de una manera concisa de manera similar en Java que pretende los objetos son inmutables?

kutschkem:

Puede ser, pero no en este caso.

En este caso, el código sabe lo que está haciendo, es de suponer. Es tal vez incluso inteded para el objeto a ser mutable. La única manera de evitar esto es copiar el objeto de valor, mutar, y luego ponerlo de nuevo. Esto podría ser muy costoso en algunos programas, también No estoy seguro de si el estilo es realmente mejor, no me siento que sería más fácil de leer o siempre menos propenso a errores. Depende de la cantidad que cree en objetos inmutables en general.

Donde se convierte en un problema es cuando están mutados cosas que no deberían estar. Pero esto no tiene nada que ver con los mapas en sí.

Por ejemplo:

En este tema en github , una referencia a una lista que se supone que es inmutable se transfieren a una parte del código que no mutan, llevando a que al menos una pérdida de memoria en este caso.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=372885&siteId=1
Recomendado
Clasificación