Imparo sempre quando dichiariamo una raccolta che dovremmo fare, Interface ob = new Class()
, se voglio usare per esempio una LinkedList che farò List ob = new LinkedList()
, ma poi non posso avere accesso a tutti i metodi da LinkedList .. Non è LinkedList ob = new LinkedList()
100% corretto?Dichiarazione di una lista connessa in Java
risposta
Non è LinkedList ob = new LinkedList() 100% corretto?
Beh, io suggerirei di usare la forma generica, ma certo - se si desidera utilizzare la funzionalità che è specifica-LinkedList
, è necessario dichiarare la variabile di conseguenza.
È possibile controllare se le interfacce Deque<E>
o Queue<E>
hanno ciò che si desidera. Se lo fanno, usa quelli in linea con l'idea di descrivere ciò di cui hai bisogno piuttosto che quale implementazione userai.
In realtà non ci sono metodi _specific_ in 'LinkedList'; tutto o sovrascrive un metodo superclasse (come 'clone()') o implementa un metodo di una delle sue interfacce. Se vuoi usare i metodi specificati da 'Deque' (ad es.' Peek() ') così come i metodi specificati da' List' (ad esempio 'indexOf()'), ma non specificato da entrambi, allora non c'è molta alternativa dichiarare la variabile come 'LinkedList'. –
Sì,
LinkedList<...> items = new LinkedList<...>();
è perfettamente corretto se si sa che items
dipenderà metodi di LinkedList<T>
che non vengono acquisite in nell'interfaccia List<T>
.
Non esattamente corretto al 100%.
Un modo preferito per dichiarare qualsiasi raccolta è includere il tipo di dati che contiene. Quindi, per il tuo esempio, sarebbe LinkedList<Integer> ob = new LinkedList<Integer>();
.
la regola "sempre il codice per le interfacce" deve essere eseguita con una certa flessibilità. quello che stai suggerendo va bene, e come sei arrivato alla conclusione, l'unica opzione.
come nota a margine, la codifica per classi concrete come questa è più veloce è la maggior parte delle JVM. decidere se lo spettacolo vale la pena di infrangere la regola è la cosa difficile da decidere.
Avete alcuni dati per sostenere questo reclamo? È la prima volta che sento che la codifica delle interfacce potrebbe essere più lenta rispetto alle lezioni concrete. –
@krzyk - Non è troppo difficile provarlo da solo. Le chiamate di metodo a qualcosa come 'list.get()' sono misurabilmente più lente (se ne fai abbastanza) quando 'list' è dichiarato' Elenco
http://developer.android.com/guide/practices/design/performance.html#myths. per essere onesti, questa affermazione riguarda JVM senza JIT. –
Se si ha effettivamente la necessità di utilizzare metodi che non sono nell'interfaccia Elenco, non c'è sicuramente nulla di sbagliato nell'utilizzo dell'API di LinkedList. La regola generale di programmazione nell'interfaccia List riconosce che 1) è piuttosto raro aver bisogno di questi metodi, e 2) nell'esperienza della maggior parte delle persone, è molto più probabile che scopro che ho bisogno di ordinare la lista e/o usare un sacco di accesso, e decidere di passare a un ArrayList, che è necessario uno dei metodi ha solo LinkedList.
Potrebbe anche essere che si possa programmare nell'interfaccia della coda, se si trova Elenco non ti fornisce ciò che ti serve.
LinkedList è un generico. Si dovrebbe fare:
LinkedList<String> linkedList = new LinkedList<String>();
(o qualsiasi altra cosa è necessario memorizzare in là, invece di String)
Si dovrebbe sempre cercare di ottenere la dichiarazione al più alto livello possibile, il che significa che si dovrebbe fermati al livello più alto che fornisce tutte le funzionalità di cui hai bisogno: se i metodi List
non sono sufficienti, stai perfettamente bene con la tua dichiarazione LinkedList
.
In realtà sarebbe meglio se fosse parametrizzato in quanto entrambi sono tipi non elaborati.
No .. Questo sarebbe sbagliato, nelle fasi successive se vuole cambiare la sua implementazione dalla lista collegata a qualsiasi altra implementazione del tipo di lista andrà male ... Quindi meglio usare la dichiarazione del livello di interfaccia.
non sarà sempre suggerire di utilizzare farmaci generici ..... Coz a volte può essere necessario per avvolgere oggetti diversi come qui ....
String str="a string";
boolean status=false;
LinkedList ll = new LinkedList();
ll.add(str);
ll.add(status);
In alcune situazioni come il caso di RMI, puoi solo inviare dati serializzati ..... e supponiamo di voler inviare un oggetto di classe (che non è serializzato) ....... In questo caso puoi racchiudere i membri della classe (primitive) in una LinkedList e passare oggetto nel suo insieme ....... non preoccuparsi dell'enorme numero di argomenti ...... Consideriamo per esempio:
public Class DataHouse
{
public int a;
public String str;
.
.
.
}
Ora qualche parte u bisogno di passare gli oggetti .... È possibile effettuare le seguenti ....
DataHouse dh =new DataHouse();
LinkedList ll = new LinkedList();
ll.add(dh.a);
ll.add(dh.str);
// Now the content is serialized and can pass it as a capsuled data......
si può ancora avere accesso a metodi LinkedList utilizzando List, tutto ciò che dovete fare è quello di tipo gettato ad esempio
((LinkedList)ob).add()
il punto di usare elenco generico e non LinkedList è perché nel caso in cui semplicemente cambia il tipo di liste che si sta utilizzando (diciamo doppia lista collegata) il programma continuerà a funzionare Generics sono semplifica il tuo codice per essere più portatile e più "modificabile"
LinkedList ob = new LinkedList(), creare oggetto in questo modo è solo per utilizzare la classe LinkedList, non c'è niente di sbagliato in esso. Di nuovo dipende da cosa si desidera da un'implementazione. –
Dipende ciò che si desidera ottenere, verificarlo: [controllare la risposta] [1] qui http://stackoverflow.com/questions/2451849/polymorphic-call –
Good Q, Marcio. Proprio ora mi sono imbattuto in una situazione in cui volevo utilizzare 'addFirst (E e)' e 'addLast (E e)', ma non ho trovato quelli nell'interfaccia 'Elenco'. – Vikram