Je me demande pourquoi java.util.ArrayList
permet d'ajouter null
. Y a-t-il un cas où je voudrais ajouter null
à un ArrayList
?
Je pose cette question parce que dans un projet, nous avions un bogue qui ajoutait du code null
à la ArrayList
et il était difficile de localiser la bogue. De toute évidence, un a NullPointerException
été lancé, mais pas avant qu'un autre code ait tenté d'accéder à l'élément. Le problème était de savoir comment localiser le code qui a ajouté l' null
objet. Il aurait été plus facile de ArrayList
créer une exception dans le code où les éléments étaient ajoutés.
java
api-design
collections
Alfredo Osorio
la source
la source
null
dans la plupart de leurs collections).null
c'est le moyen par défaut de représenter les données manquantes en Java, que cela vous plaise ou non. En fait, beaucoup de gens ne l'aiment pas et en font un argument pour des choses fonctionnelles de style programmation. La réponse la plus élevée n'a aucun sens / ne rend pas l'essence du problème.null
est. "Missing" n’est que l’une des interprétations possibles denull
. Les autres interprétations valides pourraient être «inconnu», «non applicable» ou «non initialisé». Ce quinull
dépend dépend de l'application. Comme dirait la communauté Python, "face à l'ambiguïté, refusez la tentation de deviner". Refuser de conserver la valeur null dans un conteneur parfaitement capable de le faire ne serait que cela - une supposition.Réponses:
Cette décision de conception semble principalement motivée par le nommage.
Name ArrayList suggère au lecteur une fonctionnalité similaire à celle des tableaux - et il est naturel que les concepteurs de Java Collections Framework s’attendent à ce que la grande majorité des utilisateurs d’API s’en remettent à fonctionner de la même manière que les tableaux.
Cela implique notamment le traitement des éléments nuls. L'utilisateur de l'API sachant que ci-dessous fonctionne correctement:
serait assez surpris de savoir si un code similaire pour ArrayList lancerait NPE:
Le raisonnement comme ci-dessus est présenté dans les points de contrainte du didacticiel JCF qui suggèrent une similarité étroite entre ArrayList et les tableaux simples:
Si vous souhaitez qu'une implémentation de la liste n'autorise pas les valeurs NULL, mieux vaut l'appeler de la sorte
NonNullableArrayList
ou quelque chose du genre, afin d'éviter toute confusion chez les utilisateurs d'API.Note secondaire, il y a une discussion auxiliaire dans les commentaires ci-dessous, avec des considérations supplémentaires à l' appui du raisonnement exposé ici.
la source
LinkedList
également en charge lesnull
entrées de liste.null
entrées est utile dans de nombreux cas.Null peut être une valeur valide pour un élément d'une liste. Supposons que votre liste contienne des éléments qui représentent des données optionnelles sur une liste d'utilisateurs et sont stockés dans le même ordre que les utilisateurs. Si les données supplémentaires sont renseignées, votre liste contiendra les données supplémentaires, sinon l'emplacement correspondant à un utilisateur sera nul. (Je suis sûr qu'il y a de meilleurs exemples, mais vous voyez l'idée)
Si vous ne souhaitez pas autoriser l'ajout de valeurs NULL, vous pouvez envelopper la liste de tableaux avec votre propre wrapper qui indique que la valeur null a été ajoutée.
la source
ArrayList
autorise null par conception. C'est intentionnel. Du javadoc :La réponse à "pourquoi" est que si ce n'était pas le cas, ArrayList ne serait pas utilisable dans les cas où il est nécessaire de mettre un
null
dans la liste. En revanche, vous pouvez empêcher un ArrayList de contenir des valeurs NULL en testant les valeurs avant de les ajouter ou en utilisant un wrapper qui empêche cela de se produire.De toute évidence, tout cas où
null
a une signification distincte. Par exemple, cela peut signifier que la valeur à une position donnée de la liste n’a pas été initialisée ni fournie.Vous pouvez facilement implémenter ce comportement en créant une classe wrapper. Cependant, ce n'est pas le comportement que la plupart des programmeurs / applications ont besoin.
la source
Y a-t-il un cas où je voudrais ajouter null à un ArrayList?
Bien sûr, qu'en est-il de la pré-allocation? Vous voulez une
ArrayList
chose que vous ne pouvez pas créer encore parce que vous n'avez pas assez d'informations. Ce n'est pas parce que vous ne pouvez imaginer une raison pour laquelle quelqu'un pourrait vouloir faire quelque chose que ce ne soit pas une mauvaise idée. Peu importe. (Maintenant, je suis sûr que quelqu'un va venir et dire que vous devriez plutôt avoir des objets vides qui correspondent à certains motifs sur lesquels ils ont lu sur un blog obscur et que les programmeurs devraient vraiment être capables d'écrire des programmes sans jamais utiliser d'if
instructions, blah blah.)Si vous avez un contrat qui ne devrait jamais figurer
null
dans un conteneur, il vous appartient de vous assurer que ce contrat est respecté, probablement de manière plus appropriée en affirmant. Cela vous aurait probablement pris au maximum 10 lignes de code. Java vous simplifie incroyablement la tâche. Le JDK ne peut pas lire dans vos pensées.la source
ensureCapacity(int minCapacity)
méthode et leArrayList(int initialCapacity)
constructeur.null
dans les entrées pré-allouées (mais non encore utilisées ) duArrayList
; mais nous pouvons laisserensureCapacity
faire cela et ne pas autoriser d’autres fonctions telles queset
le faire. Les raisons données ailleurs semblent plus fortes.set
un élément à n'importe quelle valeur qui pourrait être retournée parget
. Même si une tentative normale surget
un élément pour lequel de l'espace avait été attribué mais qui n'avait jamais été écrit devait renvoyer une exception plutôt que de revenirnull
, il serait toujours utile de disposer d'une paire de méthodes qui permettraientlist1.setOrEraseIfNull(index, list2.getOrReturnNull(index))
plutôt que d'exigerif (list2.valueSet(index)) list1.set(index, list2.get(index)); else list1.unset(index);
Cela semble être davantage une question philosophique (logicielle) ici.
ArrayList
en tant que classe d’utilité est conçu pour être utile dans un large contexte de cas d’utilisation possibles.Contrairement à votre affirmation cachée selon laquelle l'acceptation de null en tant que valeur valide devrait être découragée, il existe de nombreux exemples dans lesquels la valeur null est parfaitement légale.
La raison la plus importante est que
null
est l'do not know
équivalent de tout type de référence, y compris les types de cadres. Cela implique que null ne peut en aucun cas être remplacé par une version plus fluide de lanothing
valeur.Supposons donc que vous stockiez les entiers 1, 3, 7 dans votre arraylist à son index correspondant: En raison de certains calculs, vous voulez obtenir l'élément à l'index 5, votre tableau devrait donc renvoyer: "aucune valeur stockée". Cela pourrait être réalisé en renvoyant null ou un NullObject . Dans la plupart des cas, renvoyer la valeur null intégrée est suffisamment expressif. Après avoir appelé une méthode pouvant renvoyer null et utiliser sa valeur renvoyée, une vérification de la valeur renvoyée par rapport à null est assez courante dans le code moderne.
la source
La déclaration
est valable et utile (je ne pense pas avoir besoin d'expliquer pourquoi). Il est également utile d’avoir une collection de fichiers dont certains peuvent être nuls.
L'utilité des collections pouvant contenir des objets nuls découle directement de l'utilité des objets pouvant être nuls. C'est vraiment aussi simple que ça.
la source
Il est plus facile de tout accepter que d’être restrictif, puis d’essayer d’ouvrir votre projet après coup.
Par exemple, si Oracle / Sun fournissait uniquement NonNullableArrayList, mais que vous souhaitiez pouvoir ajouter un Null à votre liste. Comment le ferais-tu? Vous auriez probablement à créer un objet entièrement différent, vous ne pourriez pas utiliser une extension de NonNullableArrayList. Au lieu de cela, si vous avez un ArrayList qui prend tout, vous pouvez facilement l'étendre et redéfinir l'ajout s'il n'accepte pas les valeurs NULL.
la source
Utilité de null?
Cela est tout à fait le cas lorsque vous utilisez une liste de listes pour modéliser une plaque 2D réelle avec différentes positions. La moitié de ces positions peuvent être vides (en coordonnées aléatoires), tandis que celles remplies ne représentent pas un simple int ou String, mais sont représentées par un objet complexe. Si vous souhaitez conserver les informations de position, vous devez remplir les zones vides avec null pour que votre liste.get (x) .get (y)ne conduit pas à de mauvaises surprises. Pour contrer les exceptions nulles, vous pouvez rechercher la valeur null (très populaire) ou utiliser une option (que je trouve pratique dans ce cas). L’alternative serait de remplir les espaces vides avec des objets «indésirables» qui peuvent causer toutes sortes de dégâts sur la route. Si votre contrôle nul échoue ou est oublié quelque part, Java vous le fera savoir. D'autre part, un objet de substitution "indésirable" mal contrôlé peut passer inaperçu.
la source