2010-04-12 8 views
10

Devuelvo colecciones vacías vs. nulo siempre que sea posible. Alterno entre dos métodos para hacerlo usando java.util.Collections:Tipo seguro, genérico, vacío Colecciones con genéricos estáticos

return Collections.EMPTY_LIST; 
return Collections.emptyList(); 

donde se supone que emptyList() ser de tipo seguro. Sin embargo, recientemente he descubierto:

return Collections.<ComplexObject> emptyList(); 
return Collections.<ComplexObject> singletonList(new ComplexObject()); 

etc.

veo este método en Eclipse Explorador de paquetes:

<clinit>() : void 

pero no veo cómo se hace esto en el código fuente (1,5) ¿Cómo está sucediendo esta tontería mágica?

EDITAR: ¿Cómo se logra el tipo Genérico estático?

+3

¿Cuál es la pregunta? '' no es un método genérico sino el nombre (generado por el compilador) del método constructor especial que realiza la inicialización de clase. – Dirk

+0

Lo siento ... debería haber sido más claro.Creo que asumí incorrectamente que el bloque estático tenía algo que ver con el tipo genérico estático. – Droo

Respuesta

7

EDITAR: ¿Cómo se logra el tipo genérico estático ?

http://www.docjar.com/html/api/java/util/Collections.java.html

public class Collections { 
    ... 
    public static final List EMPTY_LIST = new EmptyList<Object>(); 
    ... 
    public static final <T> List<T> emptyList() { 
     return (List<T>) EMPTY_LIST; 
    } 
    ... 
} 

Se puede ver el enlace para la implementación de la clase EmptyList si tienes curiosidad, sino por su pregunta, no importa.

+0

Sabía que era algo así de simple. El prefijo de tipo de devolución genérico es todo lo que permite esto? Aprendí algo hoy ... – Droo

+1

Si por "prefijo de tipo de devolución genérico", te refieres al primero "", entonces sí. Sin embargo, no lo llamaría así; no deberías considerarlo como parte del tipo de devolución. Piénselo más como un modificador (método) como "público", "estático" y "final". Es el modificador de tipo parametrizado en la declaración de método que hace un método genérico. –

13
return Collections.<ComplexObject> emptyList(); 

Usando Esto deshacerse de las advertencias de Eclipse sobre las colecciones no genéricas.

Habiendo dicho eso, una lista vacía tipada va a ser funcionalmente idéntica a una lista vacía sin tipo debido a que la lista vacía es inmutable y a que Java borra los tipos genéricos en tiempo de compilación.

+0

@Tom Hawtin - tachado: "Es posible que desee considerar usar esto solo para deshacerse de las advertencias de Eclipse sobre el uso de colecciones no genéricas". En otras palabras, esto está corrigiendo el código, en lugar de usar una anotación '@ SuppressWarnings'. – Powerlord

+0

Unicornios Um, sí. Aunque el sentimiento parece ser que las advertencias no importan y hacen algo al azar para deshacerse de ellas. –

+0

@Tom Hawtin - tachado: lo he reformulado ahora. Sin embargo, no cambia que una lista vacía ** inmutable ** que se tipee sea idéntica a una que no está tipeada. En mi opinión, las advertencias sobre el uso de colecciones no genéricas no tienen sentido de todos modos; si alguien quiere usar una colección no genérica, ¿por qué debería el compilador marcar eso como una advertencia? – Powerlord

1

<clinit> es el nombre del método en el que se recopila el código de inicialización de clase durante la compilación. (Es decir, todo el código dentro de los bloques static {}, y los inicializadores de los miembros estáticos, en orden de código fuente)

No tiene nada que ver con los parámetros explícitos de tipo en las invocaciones de métodos.

2

<clinit> es el bloque de inicializador estático. Es un bloque de código que se ejecuta exactamente una vez (cuando la clase está cargada).

Así, en lugar de escribir

class A { 
    static int x = 5; 
} 

uno puede escribir:

class A { 
    static int x; 

    static { // static initializer starts 
     x = 5; 
    } 
} 

Estas dos clases son equivalentes. Dentro de un bloque de inicializador estático uno puede colocar código arbitrario y así inicializar campos estáticos con los resultados de cálculos complicados.

Cuestiones relacionadas