Hinzufügen abgeleiteter Klassen in Java List

Gast #1939763
Lesenswert?

Hallo,

ich komme eigentlich aus der C/C++ Ecke und muss nun mit Java arbeiten. 
Das trägt wahrscheinlich zu dem Problem bei, bei dem mir hoffentlich 
jemand helfen kann. Also:

Ich habe eine abstrakte Basisklasse "CommandHandler":

public abstract class CommandHandler {
   public abstract int ZuUeberladen();
}

und leite davon zwei "Spezialisten" ab:

public class CallCommandHandler extends CommandHandler{
   public int ZuUeberladen() {return 0; }
}

public class SearchCommandHandler extends CommandHandler{
   public int ZuUeberladen() {return 1; }
}

Nun möchte ich alle meine "Spezialisten" in einer Liste zusammenfassen.
Also habe ich diese für den Typ der Basisklasse angelegt:

List<CommandHandler> mAlleHandler;

Sobald ich aber nun versuche einen Handler hinzuzufügen, schmiert mein 
Programm ab bei: mAlleHandler.add(new CallCommandHandler());

Das ganze passiert in Eclipse und soll eigentlich eine Anwendung für 
Android werden. Leider kann ich auf den ersten Blick keine 
aussagekräftige Fehlermeldung finden. Das Eclipse wechslet beim steppen 
der betroffen Anweisung auf eine leere Seite und schreibt "No Source". 
Das Handy sagt das mein Programm beendet wurde.

Ich würde mich freuen, wenn mir jemand weiter helfen kann.

Viele Grüße
Gast #1939769
Lesenswert?

Vergesst es... ich glaube es ist einfach zu spät.
Ich hatte mein Listenobjekt noch nicht initialisiert:

List<CommandHandler> mAlleHandler = null;

Hoffe es hat noch keiner sein Hirn zermartert, zumal man das Problem aus 
dem voherigen Post nicht erkennen kann ;).
Persönliche Seite #1939792
Lesenswert?

0Fh schrieb:
> List<CommandHandler> mAlleHandler = null;
Nein! Damit wird es zwar initialisiert (eigentlich sollte es ohne nicht 
mal compilieren!) aber du erhälst kein gltiges Objekt...
1
List<CommandHandler> alleHandler = new ArrayList<CommandHandler>();

0Fh schrieb:
> ich komme eigentlich aus der C/C++ Ecke
Ist aber keine Entschuldigung für die mXyzABzIntPointerLister 
Schreibweise ;)
Gerade mit Eclipse unter Java unötig und macht es eigentlich nur 
schwerer zu lesen.

0Fh schrieb:
> und muss nun mit Java arbeiten
Na mit der Einstellung kommt auch wenig Freude auf, etwas mehr Freude 
bitte wenn man die Chance erhält etwas neues zu lernen :)
Gast #1939847
Lesenswert?

@Läubi: Ich glaube wir meinen dasselbe. Der Code in meinem Post ist 
enthält noch die "alte" null-Initialisierung. Nun ist es so 
initialisiert, wie du geschrieben hast:

List<CommandHandler> alleHandler = new ArrayList<CommandHandler>();

Dazu hätte ich allerdings noch eine Frage: Warum ein "ArrayList". Ich 
weiß das es sich mit "= new List<CommandHandler>(); weigert. Aber wieso?
Gut evtl. hat List keinen Default Konstruktor... aber warum dann ein 
ArrayList nehmen?

Das "muss Java" lernen ist etwas Selbstironie. Eigentlich ist es nett 
was neues zu lernen, nur im Moment stressig ;)
Persönliche Seite #1939940
Lesenswert?

0Fh schrieb:
> Ich weiß das es sich mit "= new List<CommandHandler>(); weigert.
> Aber wieso?
ALs ich mit Java begonnen habe hat mir die API von (damals noch sun) 
ganz gute Dienste geleistet, wenn du da bei List reinschaust:
http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html
SIehst du das es sich um ein Interface handelt. Ein Interface selbst ist 
aber nur eine leere Hülle vergleichbar mit einer Headerdatei welche nur 
die Deklaration enthält.

Unter "All Known Implementing Classes" werden dir einige 
Implementierungen aufgeführt welche du nutzen kannst, theoretisch 
könntest du natürlich auch deine eigene liefern.

> Dazu hätte ich allerdings noch eine Frage: Warum ein "ArrayList".
Wie oben beschrieben gibt es noch andere Implementierungen, in der 
Jeweiligen Beschreibung steht dann drinn was die Besonderheiten sind, 
ArrayList ist eigentlich ein "Allrounder".
(Siehe auch 
http://download.oracle.com/javase/1.5.0/docs/guide/collections/index.html)

Der Vorteil hier ein Interface zu nehmen anstelle der konkreten Klasse 
ist, das du die Implementierung tauschen kannst ohne deine Schnittstelle 
nach außen verändern zu müssen.

Das sieht man sehr schön an der Klasse Collections 
(http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html) 
welche viele Standardaufgabe löst (sortieren, mischen, min/max...) und 
jeweil ein Objekt welches dieses Interface implementiert aktzeptiert.

Wenn du also eine Methode hast:
1
public void tueEtwasTolles(ArrayList<T> list);
Ist das für den Aufrufer etwas blöde weil er immer eine ArrayList 
übergeben muß.
Bei
1
public void tueEtwasTolles(List<T> list);
 hingegen geht auch ein Vektor...
Wenn man also nicht die speziellen Methoden einer Klasse benötigt sollte 
man immer als Typ die "höchstmögliche" Basisklasse oder Interface 
nutzen, das macht das Leben bedeutend einfacher.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren