Como posso inicializar uma matriz String com comprimento 0 em Java?

133

O Java Docs para o método
String[] java.io.File.list(FilenameFilter filter)
inclui isso na descrição de retornos:

A matriz estará vazia se o diretório estiver vazio ou se nenhum nome foi aceito pelo filtro.

Como faço uma coisa semelhante e inicializo uma matriz String (ou qualquer outra matriz) para ter um comprimento 0?

Ron Tuffin
fonte
7
Acabei de perceber que esta é uma pergunta estúpida :( Como essas matrizes são inicializadas exatamente da mesma maneira que qualquer outra matriz apenas com um tamanho 0. Mostra a frequência com que inicializo matrizes hoje em dia. Vou deixar a pergunta (não excluí-la) porque algum dia alguém pode ser tão estúpido como eu era apenas agora :)
Ron Tuffin
1
Estou confuso sobre qual caso de uso você teria para uma matriz de comprimento 0 e por que você simplesmente não iniciaria nullnesse caso especial.
Blake

Respostas:

230

Como outros já disseram,

new String[0]

de fato criará uma matriz vazia. No entanto, há uma coisa boa sobre matrizes - o tamanho delas não pode mudar, então você sempre pode usar a mesma referência de matriz vazia. Portanto, no seu código, você pode usar:

private static final String[] EMPTY_ARRAY = new String[0];

e depois retorne EMPTY_ARRAYsempre que precisar - não há necessidade de criar um novo objeto a cada vez.

Jon Skeet
fonte
7
Parece que todo mundo gosta de digitar:private static final String[] EMPTY_ARRAY = {};
Thomas Jung
8
@ Thomas: Eu entendo o seu ponto, mas para este caso em particular prefiro a forma mais explícita. É mais claro para mim que significa "Quero uma matriz de cadeias de caracteres com 0 elementos" em vez de "Quero uma matriz com este conteúdo - que está vazio". Apenas preferência pessoal, eu acho.
Jon Skeet
1
@ Tony - eu tenho que usar os poucos lugares onde Java pode inferir um tipo. :-)
Thomas Jung
1
@delive: O exemplo que eu forneci ainda vai criar uma matriz vazia, mas porque ele está vazio, você não pode usar EMPTY_ARRAY[0]- que está tentando acesso ao elemento 0, que não existe ...
Jon Skeet
1
@theyuv: Em última análise, isso não vai importar. Se você precisar apenas em um lugar, declare-o nessa classe. Se você achar que precisa em mais lugares, sempre poderá movê-lo para uma classe "utilitária".
21816 Jon Skeet
23

String[] str = new String[0];?

mauris
fonte
18
String[] str = {};

Mas

return {};

não funcionará porque as informações de tipo estão ausentes.

Thomas Jung
fonte
10
return new String[] { };e return new String[0];ambos funcionariam.
Bombe
13

Ok, na verdade encontrei a resposta, mas pensei em 'importar' a pergunta para o SO de qualquer maneira

String[] files = new String[0];
ou
int[] files = new int[0];

Ron Tuffin
fonte
Adicione esse comentário à sua pergunta ... ou selecione uma das respostas que disse a mesma coisa.
31416 Jonathan Leffler
6
Obrigado pelo comentário Jonathan. Como você deve ter notado, eu postei essa resposta antes de mais ninguém (e, como tal, não havia respostas para selecionar). Também não vejo como adicionar a resposta à pergunta contribui para uma pergunta melhor.
Ron Tuffin 06/10/10
2

Você pode usar ArrayUtils.EMPTY_STRING_ARRAY em org.apache.commons.lang3

import org.apache.commons.lang3.ArrayUtils;

    class Scratch {
        public static void main(String[] args) {
            String[] strings = ArrayUtils.EMPTY_STRING_ARRAY;
        }
    }
freak0
fonte
0

Crie uma função que não retorne nulo; em vez disso, retorne uma matriz vazia que você pode percorrer abaixo do código para entender.

    public static String[] getJavaFileNameList(File inputDir) {
    String[] files = inputDir.list(new FilenameFilter() {
        @Override
        public boolean accept(File current, String name) {
            return new File(current, name).isFile() && (name.endsWith("java"));
        }
    });

    return files == null ? new String[0] : files;
}
Swapnil Gangrade
fonte