2011-01-24 15 views
25

¿Es posible crear una clase secundaria que extienda ArrayList? ¿Si es así, cómo?¿Se puede extender ArrayList en Java?

+0

@Rakesh Juyal Sí, lo intenté y me enfrenté a algún problema. Así que solo me estaba asegurando. – nambvarun

+0

publica el problema que enfrentaste? –

Respuesta

13

Puede extender cualquier clase que no es definitiva en Java. Una vez dicho esto, debe evitar la herencia si no hay verdadera es una relación. Considera la composición para reutilizar. Lea sobre Liskov substitution principle

3

¿Por qué no?

import java.util.ArrayList; 

public class Foo<T> extends ArrayList<T> { 
    // ... 
} 
0

Sólo pruébelo. La clase no es definitiva, su constructor es público, por lo que puedes. Sin embargo, probablemente no sea una buena idea para un principiante.

La mayoría de las veces, no es una buena idea para nadie. Imagine que agrega alguna funcionalidad y obtenga ExtList1 extends ArrayList. Una universidad tuya agrega una funcionalidad independiente diferente, por lo que tienes ExtList2 extends ArrayList. Ahora los quieres a los dos al mismo tiempo y no tienes suerte.

O necesita la misma característica con una implementación de lista base diferente (tal vez LinkedList, aunque casi siempre es incorrecto usarlo). Nuevamente, sin suerte.

Todos estos son casos en que la delegación gana. No necesita ser más detallado cuando someone has created the base already.


sólo había heredar de ArrayList, si había una muy buena razón para hacer exactamente esto. Tal vez algunos realmente extremos requisitos de rendimiento basados ​​en los puntos de referencia adecuados de JMH.

19

Sí, puedes.

public class MyArrayList<E> extends ArrayList<E> 
{ 
} 

Sin embargo, no estoy seguro de por qué desea hacerlo.

+41

para cambiarle el nombre de alguna manera más impresionante que ArrayList, por supuesto. -> Lista l = new MySuperAwesomeSandwichMakingConstantTimeLookupSwissArmyList(); – b3bop

+0

hahahahhhahabhahahahaha respuesta humorística ... matón vida b3op –

+0

para poner un punto de interrupción, por ejemplo –

6

Sí, ArrayList no es final. Utiliza este enfoque

class Foo<T> extends ArrayList<T> 
4
import java.util.ArrayList; 

public class MyArrayList<T> extends ArrayList<T> { 

    //Add extra or override methods here... 

} 
2

ArrayList no es clase final y proporciona constructor público, por lo que técnicamente se puede extender.

Pero la mejor práctica es delegado en lugar de extender. Ver: Decorator pattern

+7

Ummm ... es ** no ** una buena práctica usar delegación en lugar de herencia ** en todas las situaciones **. Debe tomar la decisión caso por caso. –

8

Como muchos otros han dicho, sí, puede ampliar la clase ArrayList, pero no es algo que deba hacer normalmente; no se considera una buena práctica en Java.

Soy principalmente un programador de Java, pero en los últimos meses también he estado trabajando en el código C#. Parece que es una expresión común en C# extender las clases de colección estándar si necesita una colección de un tipo específico (en realidad no sé si es una expresión común en general, al menos las personas que escribieron el código I ' estoy trabajando con esto todo el tiempo).

Así que si tienen una clase Person y necesitan una lista de personas, que habían crean una clase PersonList que extiende el equivalente C# de ArrayList<Person>.

La expresión común en Java sería simplemente usar ArrayList<Person> si necesita una lista de objetos Person y no crear una subclase específica para esto.

Te aconsejo que sigas la forma común de hacer las cosas en Java, y no crees tus propias subclases de ArrayList u otras clases de colección.

+0

Hola. Como está sugiriendo no anular la clase, ¿cómo obtendría una devolución de llamada cuando un elemento se agrega a una lista? – Sipty

+2

@Sipty Para algo así, donde realmente desea agregar nuevas funcionalidades en lugar de solo usarlas con un argumento de tipo específico (como en mi descripción anterior), en mi opinión, es legítimo crear una subclase. – Jesper

+1

@Sipty Overriding es una opción, pero imagine que su universidad agrega una funcionalidad independiente diferente, por lo que tiene 'ExtList1 extends ArrayList' y' ExtList2 extends ArrayList'. Ahora los quieres a los dos al mismo tiempo y no tienes suerte. O necesita la misma característica con una implementación de lista base diferente (tal vez 'LinkedList', aunque virtualmente siempre es incorrecto usarla). Estos son todos los casos en que la delegación gana. No es necesario que sea más detallado cuando [alguien ya creó la base] (https://google.github.io/guava/releases/23.0/api/docs/com/google/common/collect/ForwardingList.html). – maaartinus