È possibile creare una classe figlio che estenda ArrayList? Se é cosi, come?Puoi estendere ArrayList in Java?
risposta
È 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
Perché no?
import java.util.ArrayList;
public class Foo<T> extends ArrayList<T> {
// ...
}
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.
Sì, è possibile.
public class MyArrayList<E> extends ArrayList<E>
{
}
Tuttavia, non sono sicuro del perché si vorrebbe farlo.
per rinominarlo qualcosa di più impressionante di ArrayList, ovviamente. -> Lista l = new MySuperAwesomeSandwichMakingConstantTimeLookupSwissArmyList(); – b3bop
hahahahhhahabhahahahaha risposta umoristica ... thug life b3op –
per mettere un breakpoint per esempio –
Sì, ArrayList non è final
. Usa questo approccio.
class Foo<T> extends ArrayList<T>
import java.util.ArrayList;
public class MyArrayList<T> extends ArrayList<T> {
//Add extra or override methods here...
}
ArrayList non è classe finale e fornisce costruttore pubblico, quindi tecnicamente può essere esteso.
Tuttavia, la procedura consigliata è delegato anziché estendere. Vedi: Decorator pattern
Ummm ... è ** non ** la procedura migliore per utilizzare la delega anziché l'ereditarietà ** in tutte le situazioni **. Dovresti prendere la decisione caso per caso. –
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.
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
@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
@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
@Rakesh Juyal sì ho provato e ho affrontato qualche problema. Quindi mi stavo solo assicurando. – nambvarun
pubblica il problema che hai dovuto affrontare? –