En pratique, vaut-il mieux retourner une liste vide comme celle-ci :
return Collections.emptyList();
Ou comme ça :
return new ArrayList<Foo>();
Ou cela dépend-il complètement de ce que vous allez faire avec la liste retournée?
La principale différence est qu'elle Collections.emptyList()
renvoie une liste immuable , c'est-à-dire une liste à laquelle vous ne pouvez pas ajouter d'éléments. (Il en va de même pour l' List.of()
introduction de Java 9.)
Dans les rares cas où vous ne souhaitez modifier la liste retournée, Collections.emptyList()
et List.of()
sont donc pas un bon choix.
Je dirais que renvoyer une liste immuable est parfaitement bien (et même la manière préférée) tant que le contrat (documentation) ne stipule pas explicitement différemment.
De plus, il se emptyList()
peut que vous ne créiez pas un nouvel objet à chaque appel.
Les implémentations de cette méthode n'ont pas besoin de créer un objet List distinct pour chaque appel. L'utilisation de cette méthode est susceptible d'avoir un coût comparable à celui du champ portant le même nom. (Contrairement à cette méthode, le champ ne fournit pas de sécurité de type.)
L'implémentation de emptyList
ressemble à ceci:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
Donc, si votre méthode (qui retourne une liste vide) est appelée très souvent, cette approche peut même vous donner des performances légèrement meilleures en termes de CPU et de mémoire.
Collections.emptyList()
plus approprié pour, disons, la vérification des erreurs et autres?NullPointerException
en retournant à laCollections.emptyList()
place denull
.Collections.emptyList()
est itérable et renvoie une longueur, il peut donc être utilisé dans des boucles for sans qu'une exception ne soit levée.List.of()
?new ArrayList<>()
cela rend également la décision de conception claire; les éléments ne seront pas ajoutés à cette liste.À partir de Java 5.0, vous pouvez spécifier le type d'élément dans le conteneur:
Je suis d'accord avec les autres réponses selon lesquelles pour les cas où vous souhaitez renvoyer une liste vide qui reste vide, vous devez utiliser cette approche.
la source
List<Foo> list = Collections.emptyList()
Collections.emptyList
est immuable donc il y a une différence entre les deux versions donc vous devez considérer les utilisateurs de la valeur retournée.Le retour
new ArrayList<Foo>
crée toujours une nouvelle instance de l'objet, il a donc un coût supplémentaire très léger qui peut vous donner une raison d'utiliserCollections.emptyList
. J'aime utiliseremptyList
simplement parce que c'est plus lisible.la source
Soyez prudent cependant. Si vous revenez
Collections.emptyList()
et essayez ensuite de faire quelques changements avec lui commeadd()
ou smth comme ça, u aura unUnsupportedOperationException()
carCollections.emptyList()
retourne un objet immuable.la source
J'irais avec
Collections.emptyList()
si la liste retournée n'est en aucun cas modifiée (car la liste est immuable), sinon j'irais avec l'option 2.L'avantage de
Collections.emptyList()
est que la même instance statique est renvoyée à chaque fois et qu'il n'y a donc pas de création d'instance pour chaque appel.la source
Utilisez Collections.emptyList () si vous voulez vous assurer que la liste renvoyée n'est jamais modifiée. C'est ce qui est retourné en appelant emptyList ():
la source
Collections.emptyList()
avait un coût de construction. Voir les détails de l'implémentation (mais probablement pas la même sur toutes les JVM) confirme que ce n'est pas le cas. @Atul, de quelle machine virtuelle Java est-ce?Les réponses données soulignent le fait que
emptyList()
renvoie un immuableList
mais ne donnent pas d'alternatives. LesArrayList(int initialCapacity)
cas spéciaux du constructeur ,0
donc le retournew ArrayList<>(0)
au lieu denew ArrayList<>()
pourrait également être une solution viable:[...]
(sources de Java 1.8.0_72)
la source