Gérer la valeur null à l'aide de Goyave Cartographe/CacheBuilder
J'essaie de faire un cache à l'aide de Cartographe/CacheBuilder mais je ne comprends pas comment faire pour gérer correctement les valeurs null.
ConcurrentMap<Key, Graph> graphs = new MapMaker()
.concurrencyLevel(4)
.weakKeys()
.maximumSize(10000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.makeComputingMap(
new Function<Key, Graph>() {
public Graph apply(Key key) {
return createExpensiveGraph(key);
}
});
Si la méthode createExpensiveGraph renvoie une valeur nulle, alors une exception NullpointerException est levée.
Je ne comprends pas pourquoi le ComputingConcurrentHashMap jette un NPE au lieu de simplement retourner une valeur null.
Comment bien gérer cela ? Il suffit de prendre la NPE et retourner la valeur null à la place ?
Ai-je raté quelque chose ?
Vous devez vous connecter pour publier un commentaire.
Goyave essaie de vous forcer pour éviter d'utiliser
null
dans la mesure du possible, car irrégulière ou sans papiers comportement en présence denull
peut causer un grand nombre de confusions et de bugs. Je pense que c'est certainement une bonne idée pour éviter d'utiliser les valeurs null dans la mesure du possible, et si vous pouvez modifier votre code pour qu'il n'utilise pasnull
, je recommande fortement que l'approche de la place.La réponse à votre question dépend de façon critique sur ce qu'est une valeur "null signifie en fait dans votre application. Le plus probable, cela signifie qu'il n'y a "aucune valeur" de cette clé, ou "de rien." Dans ce cas, probablement votre meilleur pari est d'utiliser
Facultatif
, enveloppant les valeurs non null avecOptional
.et à l'usage deOptional.absent()
au lieu denull
. Si vous devez le transformer en un nulle ou non nulle valeur, vous pouvez utiliserOptional.orNull()
.Remarquez comment même dans la déclaration complète de votre question, il n'est pas encore clair si votre intention est d'établir la valeur null mis en cache ou non. Si CacheBuilder décidé à mettre en cache les valeurs null ou pas, il serait surpris de nombreux utilisateurs qui n'attendait que le contraire. Une fois de plus,
null
crée des ambiguïtés (qu'est ce que c'est meilleur à la!).Voici donc ce que vous faites.
Il est possible de déterminer que la réponse sera "null" sans la totalité des frais de
createExpensiveGraph
? c'est à dire, est-il vraiment juste une simple condition de vérifier passe? Si oui, vous devriez le faire avant de poser le cache à tous, à quel point la question de savoir si le résultat doit être mis en cache ou pas juste s'en va.Voulez-vous mettre en cache une valeur nulle? Ensuite, suivez les conseils de Louis utiliser
Optional<T>
.Sinon, le cache pas réussi à faire son travail de convoquer une valeur correcte de la clé, et la réponse appropriée est de lever une exception à partir de la mémoire cache du chargeur (non cochée si c'est le programmeur d'erreur, vérifié le contraire). Et qui fournira le comportement que vous souhaitez. Si vous jetez un checked exception, assurez-vous que vous utilisez
Cache.get
, pasCache.getUnchecked
, de l'autre côté.Voir LivingWithNullHostileCollections sur la Goyave wiki pour quelques idées sur la façon de traiter avec ce.