Na prática, é melhor retornar uma lista vazia como esta :
return Collections.emptyList();
Ou como esta :
return new ArrayList<Foo>();
Ou isso é completamente dependente do que você fará com a lista retornada?
fonte
Na prática, é melhor retornar uma lista vazia como esta :
return Collections.emptyList();
Ou como esta :
return new ArrayList<Foo>();
Ou isso é completamente dependente do que você fará com a lista retornada?
A principal diferença é que Collections.emptyList()
retorna uma lista imutável , ou seja, uma lista à qual você não pode adicionar elementos. (O mesmo se aplica ao List.of()
introduzido no Java 9.)
Nos casos raros em que você não deseja modificar a lista retornada, Collections.emptyList()
e List.of()
, portanto, são não uma boa escolha.
Eu diria que retornar uma lista imutável é perfeitamente adequado (e até a maneira preferida), desde que o contrato (documentação) não explique explicitamente de maneira diferente.
Além disso, emptyList()
pode não criar um novo objeto a cada chamada.
As implementações desse método não precisam criar um objeto List separado para cada chamada. O uso desse método provavelmente terá um custo comparável ao uso do campo com o mesmo nome. (Diferentemente deste método, o campo não fornece segurança de tipo.)
A implementação da emptyList
aparência é a seguinte:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
Portanto, se seu método (que retorna uma lista vazia) for chamado com muita frequência, essa abordagem poderá fornecer um desempenho um pouco melhor, tanto na CPU quanto na memória.
Collections.emptyList()
mais adequado para, digamos, verificação de erros e afins?NullPointerException
retornando emCollections.emptyList()
vez denull
.Collections.emptyList()
é iterável e retorna um comprimento, para que possa ser usado em loops sem que uma exceção seja lançada.List.of()
?new ArrayList<>()
também torna clara a decisão de design; elementos não serão adicionados a esta lista.A partir do Java 5.0, você pode especificar o tipo de elemento no contêiner:
Concordo com as outras respostas que, nos casos em que você deseja retornar uma lista vazia que permanece vazia, você deve usar essa abordagem.
fonte
List<Foo> list = Collections.emptyList()
Collections.emptyList
é imutável; portanto, há uma diferença entre as duas versões; portanto, você deve considerar os usuários do valor retornado.O retorno
new ArrayList<Foo>
sempre cria uma nova instância do objeto, por isso tem um custo extra muito pequeno associado a ele, o que pode lhe dar um motivo para usá-loCollections.emptyList
. Eu gosto de usaremptyList
apenas porque é mais legível.fonte
Tenha cuidado, porém. Se você retornar
Collections.emptyList()
e tentar fazer algumas alterações com algo assimadd()
, você terá umUnsupportedOperationException()
porqueCollections.emptyList()
retorna um objeto imutável.fonte
Eu aceitaria
Collections.emptyList()
se a lista retornada não estivesse sendo modificada de forma alguma (como a lista é imutável), caso contrário, eu iria com a opção 2.O benefício de
Collections.emptyList()
é que a mesma instância estática é retornada a cada vez e, portanto, não há criação de instância ocorrendo para cada chamada.fonte
Use Collections.emptyList () se quiser garantir que a lista retornada nunca seja modificada. É isso que é retornado ao chamar emptyList ():
fonte
Collections.emptyList()
tinha um custo de construção. Ver os detalhes da implementação (embora provavelmente não seja o mesmo em todas as JVMs) confirma que não. @Atul, de que JVM é essa?As respostas dadas enfatizam o fato de
emptyList()
retornar um imutável,List
mas não fornecer alternativas. OsArrayList(int initialCapacity)
casos especiais do Construtor ,0
portanto, retornar emnew ArrayList<>(0)
vez denew ArrayList<>()
também pode ser uma solução viável:[...]
(fontes do Java 1.8.0_72)
fonte