Java application de la feuille qui retourne une valeur par défaut au lieu de null
J'ai un Map<String, List<String>>
dans mon code, où j'avais d'éviter d'éventuels pointeurs null si la carte est #get()
méthode renvoie une liste vide au lieu de null. Est-il quelque chose comme cela dans l'API java? Dois-je simplement étendre HashMap
?
- à l'aide de la décoratrice le motif serait probablement meilleure que l'extension de table de hachage...
- Je ne doute pas de toi, mais pourquoi serait-il mieux?
- Pourquoi voudriez-vous vous limiter à il toujours une table de hachage? Que faire si parfois tu voulais une LinkedHashMap? Ou un ConcurrentHashMap? Ou un TreeMap? Fondamentalement, favorable à la composition au cours de l'héritage 🙂
- Je ne suis pas trop familier avec le décorateur panneau, comme le montrent les exemples sont généralement de l'interface de conception, dont je ne fais pas. Je devine par @Jon déclaration qu'un décorateur d'éviter la liaison à une mise en oeuvre particulière?
- Oui. Voir ma réponse un peu plus en détail.
- Ok, j'ai fait des recherches et comprendre le décorateur modèle maintenant. Merci. Vous devriez mettre cette réponse ci-dessous afin que je puisse donner du crédit!
- la réponse est un exemple du pattern décorateur.
- Je recommande fortement d'utiliser une Goyave
Multimap
comme suggéré par @Stephen C. je pense que c'est ce que vous voulez vraiment, plutôt que d'un usage généralMap
qui retourne une valeur non nulle quand il ne contient pas une clé. - groups.google.com/forum/?fromgroups#!topic/goyave-discuter/...
- C'est un doublon de stackoverflow.com/questions/7519339/...
Vous devez vous connecter pour publier un commentaire.
@Jon réponse est un bon moyen de faire ce que vous demandez directement.
Mais me semble que ce que vous pourriez être en train d'essayer de mettre en œuvre est un "multimap"; c'est à dire une cartographie à partir d'une clé à une collection de valeurs. Si c'est le cas, alors vous devriez aussi regarder la multimap classes dans la Goyave ou Apache commons collections.
Regardez:
com.google.commun.collecter.Multimap
interface et sa mise en oeuvre, ouorg.apache.commons.les collections.MultiMap
interface et sa mise en oeuvre.org.apache.commons.collections4.MultiMap
interface et sa mise en oeuvre (une nouvelle version de la précédente MultiMap, introduit dans la v4).get()
sur unMultimap
qui ne contient pas le retour de la clé videCollection
par contrat... exactement ce que l'OP veut. Ce n'est pas vrai de l'Apache CommonsMultiMap
qui a un comportement non spécifié.Grâce à
default
méthodes, Java 8 est maintenant construit dans cette avecMap::getOrDefault
:Comme indiqué dans les commentaires:
Goyave eu l'idée d'un "calcul de la carte", qui va exécuter une fonction de fournir une valeur si il n'est pas présent. Il a été mis en œuvre dans
MapMaker.makeComputingMap
; vous pouvez maintenant utiliserCacheBuilder
- voirCacheBuilder.construction
pour plus de détails.Il est peut-être exagéré pour ce que vous êtes après, vous pourriez être mieux de simplement écrire un
Map
de mise en œuvre qui a unMap
(à l'aide de la composition plutôt que de l'étendre à tout particulier de mise en œuvre) et puis il suffit de retourner la valeur par défaut si il n'est pas présent. Chaque méthode autre queget
pourrait probablement juste de déléguer à l'autre de la carte:get()
: que si la carte ne contient pas la clé,null
est retourné. Pour être conforme, vous devez remplacercontainsKey()
à toujours retourtrue
. Je supposemakeComputingMap()
serait de faire aussi bien mais ne la trouverez pas explicite dans les docs.// etc
n'est pas petite, et rend cette solution peu pratique de l'OMI.MapMaker.makeComputingMap
est mortSimilaire aux précédents posts, sauf que vous pouvez simplement remplacer la méthode get, si vous voulez changer son comportement.
Goyave a une méthode pour faire exactement ce que vous voulez. Il est semblable à Argote de réponse.
Map
de mise en œuvre qui a une valeur par défaut?Function
, qui est similaire à unMap
. LeMap
interface ne permet pas de valeurs par défaut.Map
, et vous dire que ce n'est "exactement ce que vous voulez".Map
's contrat, de sorte que l'OP veut quelque chose qui n'est pas unMap
. 🙂Il me semble que vous pouvez tout simplement écrire une fonction wrapper pour obtenir la valeur que vous voulez et si c'est
null
retourner la valeur par défaut à la place.Cela suppose que votre
myMap
est une variable globale (pour des raisons de simplicité), si ce n'est pas ce que vous voulez, alors vous pouvez également étendreMap
ouHashMap
en quelque chose commeMyMap
et il suffit d'inclure cette fonction supplémentaire. De cette façon, vous pouvez l'utiliser depuis n'importe quel endroit où unMyMap
objet est instancié.