List list - anstatt ArrayList list = new ArrayList

Blakh

Bekanntes Mitglied
Ich zitiere mal aus http://www.java-forum.org/buecher-tutorials-links/9949-java-code-warnung.html.

In dem Buch wird wirklich hunderte von malen geschrieben
Code:

ArrayList variable = new ArrayList();
// oder
public void meineFkt(ArrayList argument)
// oder
HashMap myMap = new HashMap();
// oder
private HashMap memberVariable;

kann das wahr sein??????????????

dass jemand ein Buch für Fortgeschrittene schreibt und die allereinfachsten Dinge nicht beherrscht? Jeder Dorfdepp hätte
Code:

List variable = new ArrayList();
// oder
public void meineFkt(Collection argument)

gemacht (je nach Anforderung).

Was ist der Vorteil davon, dass ich z.B. List list = new ArrayList() anstatt ArrayList list = new ArrayList() verwende etc.?

mfg
 
Stichwort "Gegen das Interface Programmieren". Immer den Typ verwenden, der die jeweiligen Anforderungen "minimal" erfüllt. List ist allgemeiner als ArrayList. Wenn man sowas hat wie
Code:
void someMethod(ArrayList x) { ... }
Dann kann man die nicht mit
Code:
Vector v = new Vector();
someMethod(v);
aufrufen. Wenn sie
Code:
void someMethod(List x) { ... }
heißen würde, würde das gehen (Vector ist auch eine List).
 
Das heißt ich soll immer sowas verwenden, solang ich nur die Methoden benötige die vom Interface vorgegeben sind? Oder gibt es da Ausnahmen?

List<Type> list= new CopyOnWriteArrayList<Type>();
 
Ja. Und wenn es nur ein Collection sein muss, dann
Collection<Type> collection = new CopyOnWriteArrayList<Type>();
Und wenn es nur ein Iterable sein muss, dann
Iterable<Type> iterable = new CopyOnWriteArrayList<Type>();
Und wenn es nur ein Object sein muss, dann
Object object = new CopyOnWriteArrayList<Type>(); :joke:
 
Na denn pass ich meinen Code mal an :/. Ich lern im Forum echt mehr als beim Studium. Aber die Methoden werden schon trotzdem von CopyOnWriteArrayList verwendet?
 
Zuletzt bearbeitet:
Und was mach ich bei variablen die auch zurückgegeben werden? Da weiß man ja nicht, ob man später Funktionen von ArrayList, List oder doch nur Collection benötigt.

Deklariere ich da gleich als ArrayList oder caste ich und return es ?
 
wenn du List statt ArrayList zurückgibst, musst du nicht casten,
bei Rückgabewert wie auch bei Variablendeklarationen würde ich, wenn nicht anders nötig, immer das bestimmende Interface verwenden,
ArrayList ist egal, das braucht man nahezu nie (Ausnahme bei mir: ArrayList ist serialisierbar, List als Interface nicht)

aber List statt Collection macht schon einen Unterschied,
wer eine List braucht und nur Collection bekommt (von anderer lokaler Variable oder Methoden-Rückgabewert),
erstellt vielleicht unnötig extra eine Kopie obwohl das Collection-Objekt auch schon eine Liste war,

im besonderen Maße zu vermeiden ist es, unbekannte komische Klassen zu verbreiten, wie CopyOnWriteArrayList
oder die Hibernate-API mit ihren unbekannten internen List-Typen
 
Ok, also reicht ja List anstatt CopyOnWriteArrayList, wenn ich keine Serialisierbarkeit brauche und Collection, wenn ich es nicht mal zurückgebe, sondern nur als Listener-Liste verwende und remove, add, clear benötige.

Dankö
 
Unbekannt: In keinen "Was ist eigentlich Java?"-Tutorial wird sie erwähnt (im Gegensatz zu Vector...)
Komisch: =~= Speziell 😉

EDIT: Aber natürlich ist sie praktisch, nicht nur für Concurrency - insbesondere für Listener lege ich immer in so ein Ding...
 
Die sind halt nicht so gebräuchlich wie ArrayList und im Grunde sind nur die Methoden des List-Interfaces vorhanden wie bei der ArrayList eben auch.
 

Zurück
Oben