J'ai utilisé ConcurrentMap de Java pour créer une carte qui peut être utilisée à partir de plusieurs threads. La méthode putIfAbsent est excellente et beaucoup plus facile à lire et à écrire que les opérations standard de la carte. J'ai du code qui ressemble à ceci :
ConcurrentMap<String, Set<X>> map = new ConcurrentHashMap<String, Set<X>>();
// ...
map.putIfAbsent(name, new HashSet<X>());
map.get(name).add(Y);
La lisibilité est excellente, mais il faut créer un nouveau HashSet à chaque fois, même s'il est déjà dans la carte. Je pourrais écrire ceci :
if (!map.containsKey(name)) {
map.putIfAbsent(name, new HashSet<X>());
}
map.get(name).add(Y);
Avec ce changement, il perd un peu en lisibilité mais n'a pas besoin de créer le HashSet à chaque fois. Qu'est-ce qui est le mieux dans ce cas ? J'ai tendance à me ranger du côté de la première solution, car elle est plus lisible. La seconde serait plus performante et peut-être plus correcte. Il existe peut-être une meilleure façon de procéder que l'une ou l'autre.
Quelle est la meilleure pratique pour utiliser un putIfAbsent de cette manière ?