¿Cómo puedo inicializar una matriz de cadenas con longitud 0 en Java?

133

Los documentos de Java para el método
String[] java.io.File.list(FilenameFilter filter)
incluyen esto en la descripción de devoluciones:

La matriz estará vacía si el directorio está vacío o si el filtro no acepta nombres.

¿Cómo hago algo similar e inicializo una matriz de cadenas (o cualquier otra matriz) para que tenga una longitud 0?

Ron Tuffin
fuente
77
Me acabo de dar cuenta de que esta es una pregunta estúpida :( Como estas matrices se inicializan exactamente de la misma manera que cualquier otra matriz con un tamaño 0. Muestra con qué frecuencia inicializo las matrices hoy en día. Dejaré la pregunta (no la eliminaré) porque algún día alguien más podría ser tan estúpido como yo ahora :)
Ron Tuffin
1
Estoy confundido acerca de qué caso de uso tendría para una matriz de longitud 0, y por qué no lo haría simplemente nullen ese caso especial.
Blake

Respuestas:

230

Como otros han dicho,

new String[0]

de hecho creará una matriz vacía. Sin embargo, hay algo bueno acerca de las matrices: su tamaño no puede cambiar, por lo que siempre puede usar la misma referencia de matriz vacía. Entonces, en su código, puede usar:

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

y luego regresa EMPTY_ARRAYcada vez que lo necesites; no es necesario crear un nuevo objeto cada vez.

Jon Skeet
fuente
77
Parece que a todos les gusta escribir:private static final String[] EMPTY_ARRAY = {};
Thomas Jung
8
@Thomas: Tomo su punto, pero para este caso en particular prefiero la forma más explícita. Para mí es más claro que significa "Quiero un conjunto de cadenas con 0 elementos" en lugar de "Quiero un conjunto con este contenido, que está vacío". Solo preferencia personal, supongo.
Jon Skeet el
1
@ Tony - Tengo que usar los pocos lugares donde Java puede inferir un tipo. :-)
Thomas Jung el
1
@delive: El ejemplo que proporcioné seguirá creando una matriz vacía, pero como está vacía, no se puede usar EMPTY_ARRAY[0], ya que está intentando acceder al elemento 0, que no existe ...
Jon Skeet,
1
@theyuv: En última instancia, no va a importar. Si solo lo necesita en un lugar, declare en esa clase. Si encuentra que lo necesita en más lugares, siempre puede moverlo a una clase de "utilidad".
Jon Skeet
23

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

mauris
fuente
18
String[] str = {};

Pero

return {};

no funcionará ya que falta la información de tipo.

Thomas Jung
fuente
10
return new String[] { };y return new String[0];ambos funcionarían.
Bombe
13

Ok, en realidad encontré la respuesta, pero pensé que 'importaría' la pregunta a SO de todos modos

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

Ron Tuffin
fuente
Agregue ese comentario a su pregunta ... o seleccione una de las respuestas que dice lo mismo.
Jonathan Leffler el
66
Gracias por el comentario Jonathan. Como habrás notado, publiqué esta respuesta antes que nadie (y como tal no había respuestas para seleccionar). Tampoco veo cómo agregar la respuesta a la pregunta hace una mejor pregunta.
Ron Tuffin
2

Puede usar ArrayUtils.EMPTY_STRING_ARRAY de 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
fuente
0

Realice una función que no devolverá nulo, sino que devolverá una matriz vacía que puede recorrer a continuación para comprender el código.

    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
fuente