Est-il un standard de Java Liste de mise en œuvre qui ne permet pas l'ajout d'null?
Dire que j'ai un List
et je sais que je n'ai jamais souhaitez ajouter null
à elle. Si je suis ajoutant null, cela signifie que je suis en train de faire une erreur. Donc à chaque fois que je serait autrement appel list.add(item)
j'aurais plutôt appeler if (item == null) throw SomeException(); else list.add(item);
. Est-il un List
classe (peut-être dans Apache Commons ou quelque chose) qui fait cela pour moi?
Question similaire: De l'aide pour supprimer les références null dans une Liste sur Java? mais je ne veux pas supprimer tous les zéros, je veux faire en sorte qu'ils n'ont jamais ajouté en premier lieu.
- Ne pourriez-vous sous-classe de la classe List et ajouter les fonctionnalités dont vous avez cités?
- C'est une bien jolie sur mesure exigence;
null
est parfaitement acceptable de la valeur à tenir dans un conteneur (dans la plupart des cas). Ainsi, vous aurez probablement besoin de rouler votre propre emballage. - Je pourrais, mais je voudrais avoir à remplacer (au moins, sur le dessus de ma tête)
add
,addAll
, en plus d'un constructeur ou deux. Il ne serait probablement pas difficile mais je soupçonne quelqu'un (Apache, Google...) a déjà fait, et a pris un subtil bug quelque part que je serait probablement manquer. - Ainsi, les Collections de l'API est très clair en permettant un Nullpointer exception dans le cas de la collection ne supporte pas les valeurs null. Donc clairement, l'API considère cette affaire et n'en décide autrement.
- Je vient juste de découvrir ceci: kiwidoc.com/java/l/p/commons-collections/commons-collections/... qui n'a pas vraiment répondu à ma question d'origine, mais qui sert un but similaire.
InformationsquelleAutor MatrixFrog | 2011-06-22
Vous devez vous connecter pour publier un commentaire.
Attention, plusieurs réponses ici sont en prétendant résoudre votre problème en l'enveloppant d'une liste et de vérifier dans
add
etaddAll
, mais ils sont oublier que vous pouvez également ajouter à uneList
par l'intermédiaire de sonlistIterator
. Il est difficile d'obtenir une contrainte de la liste de droite, qui est pourquoi la Goyave aConstraints.constrainedList
de le faire pour vous.Mais avant de voir que, d'abord vous demander si vous avez seulement besoin d'un immuable liste, auquel cas la Goyave est
ImmutableList
fera null vérification pour vous de toute façon. Et à tout hasard que vous pouvez utiliser l'un de la du JDK deQueue
implémentations au lieu de cela, que vais le faire aussi.(Bonne liste de null-hostile collections: https://github.com/google/guava/wiki/LivingWithNullHostileCollections)
Constraints
a été supprimé depuis Goyave 16L'Utilisation D'Apache Commons Collection:
L'ajout de la valeur null à cette liste jette
IllegalArgumentException
. En outre, vous pouvez revenir en toute mise en œuvre de la Liste que vous voulez, et si nécessaire, vous pouvez ajouter plus de Prédicats d'être vérifié.Même chose existe pour les Collections en général.
Utiliser Google Goyave:
L'ajout de la valeur null à cette liste jette
NullPointerException
.Autant que je sache, il n'existe aucune norme de mise en œuvre disponibles dans le JDK. Cependant, la Collection spec dit que NullPointerException doivent être jetés quand une collection ne prend pas en charge les valeurs null. vous pouvez utiliser le wrapper suivant pour ajouter de la fonctionnalité à toute Collection (vous aurez à mettre en œuvre les autres méthodes de Collecte de déléguer à la enveloppé exemple):
IllegalArgumentException
que null est un argument illégal. Voir stackoverflow.com/questions/3881/...public T get(int i) { return wrapped.get(i); }
, c'est pourquoi j'ai été en espérant pour un one-liner réponse comme Fatal de.Vous pouvez le faire simplement en enroulant une instance d'une Liste et de fournir le null-vérifié ajouter une méthode. En d'autres termes, votre classe aurait juste un couple de méthodes et de l'intérieur de la variable.
Si vous avez besoin de toutes les fonctionnalités d'une liste, vous pourriez envisager de Goyave est (utilisé à Google Collections) ForwardingList.
Une autre approche est de simplement étendre la Liste, mais la chasse aux sorcières, c'est que vous devez remplacer les deux
add
etaddAll
.Fait intéressant, la goyave est un standardAddAll, qui peut être utilisé comme la mise en œuvre de addAll, ce qui résout au moins une partie du problème.
Constraints.constrainedList(list, Constraints.notNull())
que Kevin B mentionné dans sa réponse ici.Bien que ce problème de tri des cris de "délégué", il est beaucoup plus facile avec un sous-classement puisque vous avez l'intention d'hériter de presque tous les mêmes fonctionnalités.
Collections.unmodifiableList
est. Et puis je pense que, attendez, peut-être quelqu'un est déjà passé par tout cela.Cela devrait fonctionner
cependant un bug dans le addAll mise en œuvre signifie que vous devez utiliser les
et vous obtenez
add
mise en œuvre? Comme je l'ai dit sur mP de réponse, le doc a dit: "Depuis que null est considéré comme une valeur de n'importe quel type de référence, de la liste retournée permet l'insertion d'éléments null chaque fois que la sauvegarde de la liste n'." kiwidoc.com/java/l/p/java/j2se/1.6/p/java.util/c/Collections il me semble Donc queadd
est droit etaddAll
est faux.if(!type.isIntance(o))
il n'y a pas de traitement particuliernull
pour l'autoriser. Personnellement, c'est le comportement que je ne veux.checkedList
travaillé, exactement ce que les docs disent que c'est le cas, alorscheckedList(x)
etcheckedList(checkedList(x))
permettrait à la fois de permettre l'ajout de zéros, si x a permis l'ajout de valeurs null. Ce qui signifie que la mise à niveau vers une version plus récente de Java serait de modifier le comportement de ce code.add
est faux etaddAll
est droit." Mais en fait, les deux méthodes sont mauvaises. Voir mon commentaire sur la page du bug...add
etaddAll
méthodes explicitement vérifier et de permettrenull
avant d'utiliser instanceof.essayer Collections.checkedList().