2011-01-04 17 views

Respuesta

10

Ninguna, desde una perspectiva de creación. Ambos crean una instancia de ArrayList.

La diferencia es que, en el segundo ejemplo que, al permite el acceso a todos los métodos implementados en el List interfaz, mientras que, en el primer ejemplo, al permite el acceso a todos los métodos y campos de la clase ArrayList (accesibles).

Una regla práctica: utilice el segundo patrón. Si necesita algunos beneficios extras de la aplicación ArrayList, entonces siempre se puede emitir:

List list = new ArrayList(); 
// do some adds/removes/... on the list 
((ArrayList) list).trimToSize(); 
+0

¿Qué es la regla de oro? –

+0

@Hari kanna: utilice un tipo de interfaz, si está disponible, así 'Lista' o incluso' Colección'. Eso es lo que hago en el 99.5% de todos los casos. –

7

Su llamados prog embistiendo a la interfaz. Supongamos que necesita devolver este list de su método. Entonces el código de llamada puede tener eso en una variable List.

public ArrayList getList() { 
    ArrayList list = new ArrayList(); 
    // do something with the list here 
    return list; 
} 

Y esto,

public List getList() { 
    List list = new ArrayList(); 
    // do something with the list here 
    return list; 
} 

Ahora, para este último código de método que llama puede tener la lista devuelta en List variable de tipo. Y fácilmente puede decidir más tarde, por alguna razón, algo como esto,

public List getList() { 
    List list = new LinkedList(); 
    // do something with the list here 
    return list; 
} 

Sin cambios en el código de llamada, mientras que con el anterior es necesario cambiar el tipo de retorno, que con el tiempo arruine el código de llamada, así .

+0

por favor explique en detalle –

+4

@Hari Kanna: Yo solo estaba haciendo eso :). –

7

parafraseando my answer-this very similar question sobre Map vs HashMap:

No hay ninguna diferencia entre los objetos. Hay una diferencia en la interfaz que tiene para el objeto. En el primer caso, la interfaz es ArrayList, mientras que en el segundo es List. El objeto subyacente, sin embargo, es el mismo.

La ventaja de usar List es que puede cambiar el objeto subyacente para que sea un tipo diferente de lista sin romper su contrato con ningún código que lo esté usando. Si lo declara como ArrayList, debe cambiar su contrato si desea cambiar la implementación subyacente.

+0

Ah, y resulta que había un duplicado exacto usando 'List'. :-) –