2011-07-21 16 views
36

PREGUNTA

Esto puede ser una pregunta tonta, pero ¿hay alguna diferencia entre foo() y bar()?una matriz vacía


CÓDIGO

private static File[] foo() { 
    return Collections.emptyList().toArray(new File[0]); 
} 

private static File[] bar() { 
    return new File[0]; 
} 

Estoy tratando de pensar en la mejor manera de devolver una matriz vacía, en lugar de null.

+1

'foo() 'se recomienda sólo para ocultar lo que está haciendo el código. –

+0

@Carlos, admito que es intrincado, pero los dos métodos son esencialmente equivalentes, ¿no? – Moonbeam

+4

equivalente si ignora la legibilidad ... puede complicar casi todo. ¿Cuál es la mejor manera de devolver cero? 'return 15 - 3 * 5 + 0;'? –

Respuesta

62

Una forma diferente de devolver una matriz vacía es usar una constante, ya que todas las matrices vacías de un tipo determinado son iguales.

private static final File[] NO_FILES = {}; 
private static File[] bar(){ 
    return NO_FILES; 
} 
+0

Sí, esa es la otra forma en que lo he visto hecho. Creo que el hecho de que 'foo()' funcionó me desorientó un poco. Y no estaba seguro de si referirme a una constante tendría algún beneficio. No sé ... solo mi inexperiencia, supongo. – Moonbeam

+0

+1: como una matriz vacía es inmutable, esta es la mejor solución. –

+0

@ Moobeam, desde el punto de vista del rendimiento, significa que no necesita crear un objeto cada vez. –

14

Definitivamente el segundo. En el primero, usa un List<?> constante vacío y luego conviértalo en un File[], que requiere crear una matriz File[0] vacía. Y eso es lo que haces en el segundo en un solo paso.

+5

+1: El primero es confuso. Pero no crea una lista. EmptyList() devuelve una constante. –

+0

@Peter: Gracias, no sabía. Edité mi respuesta. Te daré +1. –

1

No hay diferencia, excepto el hecho de que foo realiza 3 llamadas a métodos visibles para devolver una matriz vacía que de todos modos se crea mientras bar() simplemente crea esta matriz y la devuelve.

0

estoy bastante seguro de que hay que ir con bar(); porque con foo(); se crea una lista (para nada), ya que se crea un nuevo archivo [0] en el final de todos modos, ¿por qué no ir directamente a devolverlo!

18

Tanto foo()bar() y puede generar advertencias en algunos entornos de desarrollo. Por ejemplo, IntelliJ IDEA generará una advertencia Allocation of zero-length array.

Un enfoque alternativo es utilizar Apache Commons Lang función 3 ArrayUtils.toArray() con argumentos vacíos:

public File[] bazz() { 
    return ArrayUtils.toArray(); 
} 

Este enfoque es a la vez el rendimiento y amistoso IDE, sin embargo, requiere una dependencia tercera parte. Sin embargo, si ya tiene Commons-lang3 en la ruta de clases, incluso se podría utilizar matrices vacías definidas estáticamente para los tipos primitivos:

public String[] bazz() { 
    return ArrayUtils.EMPTY_STRING_ARRAY; 
} 
Cuestiones relacionadas