2011-01-24 27 views
25

È possibile creare una classe figlio che estenda ArrayList? Se é cosi, come?Puoi estendere ArrayList in Java?

+0

@Rakesh Juyal sì ho provato e ho affrontato qualche problema. Quindi mi stavo solo assicurando. – nambvarun

+0

pubblica il problema che hai dovuto affrontare? –

risposta

13

È possibile estendere qualsiasi classe che non è finale in Java. Detto questo, si dovrebbe evitare l'ereditarietà se non esiste una relazione true is-a. Considera la composizione per il riutilizzo. Per saperne di più Liskov substitution principle

3

Perché no?

import java.util.ArrayList; 

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

Basta provarlo. La classe non è definitiva, il costruttore è pubblico, quindi puoi. Tuttavia, probabilmente non è una buona idea per un principiante.

La maggior parte delle volte non è una buona idea per nessuno. Immagina di aggiungere alcune funzionalità e ottenere ExtList1 extends ArrayList. Un tuo college aggiunge una diversa funzionalità indipendente, quindi hai ExtList2 extends ArrayList. Ora li vuoi entrambi contemporaneamente e sei sfortunato.

Oppure è necessaria la stessa funzionalità con un'implementazione diversa dell'elenco di base (forse LinkedList, anche se è praticamente sempre sbagliato utilizzarlo). Di nuovo, sfortunato.

Questi sono tutti i casi in cui vince la delega. Non è necessario essere più dettagliato quando someone has created the base already.


avevo ereditato solo ArrayList, se ci fosse una buona ragione per fare esattamente questo. Forse alcuni requisiti di prestazioni davvero estremi basati su benchmark JMH corretti.

19

Sì, è possibile.

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

Tuttavia, non sono sicuro del perché si vorrebbe farlo.

+41

per rinominarlo qualcosa di più impressionante di ArrayList, ovviamente. -> Lista l = new MySuperAwesomeSandwichMakingConstantTimeLookupSwissArmyList(); – b3bop

+0

hahahahhhahabhahahahaha risposta umoristica ... thug life b3op –

+0

per mettere un breakpoint per esempio –

6

Sì, ArrayList non è final. Usa questo approccio.

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 non è classe finale e fornisce costruttore pubblico, quindi tecnicamente può essere esteso.

Tuttavia, la procedura consigliata è delegato anziché estendere. Vedi: Decorator pattern

+7

Ummm ... è ** non ** la procedura migliore per utilizzare la delega anziché l'ereditarietà ** in tutte le situazioni **. Dovresti prendere la decisione caso per caso. –

8

Come molti altri hanno detto, sì, è possibile estendere la classe ArrayList, ma non è qualcosa che si dovrebbe normalmente fare; non è considerato una buona pratica in Java.

Sono principalmente un programmatore Java, ma negli ultimi mesi ho anche lavorato sul codice C#. Sembra che sia un idioma comune in C# estendere le classi di raccolta standard se hai bisogno di una raccolta di un tipo specifico (in realtà non so se è un idioma comune in generale - almeno le persone che hanno scritto il codice I ' Lavorando con me lo fanno sempre).

Quindi, se hanno una classe Person e hanno bisogno di un elenco di persone, che avevano creare una classe PersonList che estende il C# equivalente di ArrayList<Person>.

L'idioma comune in Java è quello di utilizzare ArrayList<Person> se è necessario un elenco di oggetti Person e non creare una sottoclasse specifica per questo.

Vorrei consigliarvi di attenervi al comune modo di fare Java e non creare sottoclassi di ArrayList o altre classi di raccolta.

+0

Ehi lì. Dato che stai suggerendo di non sovrascrivere la classe, come farei per ottenere una richiamata, quando un elemento viene aggiunto a un elenco? – Sipty

+2

@Sipty Per qualcosa del genere, in cui si desidera veramente aggiungere nuove funzionalità invece di usarlo solo con un argomento di tipo specifico (come nella mia descrizione precedente), a mio parere è legittimo creare una sottoclasse. – Jesper

+1

@Supty Overriding è un'opzione, ma immagina che il tuo college aggiunga una diversa funzionalità indipendente, quindi hai 'ExtList1 estende ArrayList' e' ExtList2 estende ArrayList'. Ora li vuoi entrambi contemporaneamente e sei sfortunato. O hai bisogno della stessa funzionalità con un'implementazione diversa dell'elenco di base (forse 'LinkedList', anche se è praticamente sempre sbagliato utilizzarla). Questi sono tutti i casi in cui vince la delega. Non deve essere più prolisso quando [qualcuno ha già creato la base] (https://google.github.io/guava/releases/23.0/api/docs/com/google/common/collect/ForwardingList.html). – maaartinus