138 votes

Est-il un moyen pour éviter null vérifier avant le pour-chaque itération de boucle commence?

Chaque fois que je dois effectuer une itération sur une collection j'arrive à la fin de la vérification pour les nuls, juste avant l'itération de la boucle for-each commence. Comme ceci:

if( list1 != null ){
    for(Object obj : list1){

    }
}

Est-il un moyen plus court, de sorte que nous pouvons éviter d'écrire le bloc "if"? Note: je suis à l'aide de Java 5, et sera coincé avec elle pendant un certain temps.

99voto

SLaks Points 391154

Si possible, vous devez concevoir votre code, telles que les collections ne sont pas null dans la première place.

null collections sont de mauvaise pratique (pour cette raison); vous devez utiliser des collections vide à la place. (par exemple, Collections.emptyList())

Alternativement, vous pourriez faire un wrapper de la classe qui implémente Iterable et prend des collections, et gère un null de la collecte.
Vous pouvez ensuite écrire foreach(T obj : new Nullable<T>(list1))

54voto

Edwin Buck Points 33097
public <T extends Iterable> T nullGuard(T item) {
  if (item == null) {
    return Collections.EmptyList;
  } else {
    return item;
  }
}

vous permettra d'écrire

for (Object obj : nullGuard(list)) {
  ...
}

Bien sûr, ce vraiment juste déplace la complexité ailleurs.

36voto

rk2010 Points 787

Je suppose que la bonne réponse est que: il n'y a aucun moyen de faire plus court. Il y a certaines techniques, telles que celles dans les commentaires, mais je ne me vois pas les utiliser. Je pense qu'il est préférable d'écrire un bloc "if", que l'usage de ces techniques. et oui.. avant que quelqu'un le mentionne encore une fois :) "idéalement" le code doit être conçu tel que la liste ne doit pas être null

17voto

gavenkoa Points 6974

Null vérifier sur un renforcement de la boucle

public static <T> Iterable<T> emptyIfNull(Iterable<T> iterable) {
    return iterable == null ? Collections.<T>emptyList() : iterable;
}

Ensuite, utilisez:

for (Object object : emptyIfNull(someList)) { ... }

7voto

unholysampler Points 9454

Comment beaucoup plus courte voulez-vous qu'il soit? C'est seulement un supplément de 2 lignes ET il est clair et concis et logique.

Je pense que la plus importante chose que vous devez décider est de savoir si null est une valeur valide ou pas. Si elles ne sont pas valides, vous devez vous écrire du code pour l'empêcher de se produire. Ensuite, vous n'auriez pas besoin de ce genre de vérification. Si vous allez obtenir une exception tout en faisant un foreach boucle, c'est un signe qu'il y a un bug quelque part dans votre code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X