[Info 2] instanceof - Problem

Antworten
netsrac
Beiträge: 12
Registriert: 28.05.2008 21:07

[Info 2] instanceof - Problem

Beitrag von netsrac »

Hi

folgende Problematik: Es gibt die Klassen "Fahrzeug" und die Subklassen "Auto" und "Fahrrad". Ich habe eine Liste vom Typ "Fahrzeug". Jetzt möchte ich wissen, ob der Subtyp eines enthaltenen Elements z.B. "Auto" ist. Geht das mit dem instanceof-Operator? Z.B. in folgender Weise:

List<Fahrzeug> liste;
Iterator <Fahrzeug> it = liste.iterator();

while (it.hasNext()) {
Fahrzeug f = it.next();
if (f instanceof Auto) {
...
}
}

Die Frage dafür ist jetzt: Vergleicht instanceof mit dem statischen oder dynamischen Typ von f? Wenn das so nicht geht, wie kann man das anders lösen?

Danke!
Benutzeravatar
M_A_D
Beiträge: 196
Registriert: 13.10.2009 12:57
Name: Mähäääd!
Geschlecht: weiblich
Studienrichtung: Elektrotechnik
Matrikel: 2009
Angestrebter Abschluss: Doktor

Re: [Info 2] instanceof - Problem

Beitrag von M_A_D »

müsste so gehen
Wer von euch Hässlichen meint ich sei oberflächlich?
Alex
Beiträge: 265
Registriert: 12.10.2004 15:01

Re: [Info 2] instanceof - Problem

Beitrag von Alex »

Ja, das geht. Wobei

f instanceof Fahrzeug

auch immer wahr ist.


Anzumerken wäre noch, dass instanceof-Abfragen meist als schlechter Programmierstil angesehen werden. Der Grund ist einfach, dass eine instanceof-Abfrage vergleichsweise sehr viel Rechenzeit in Anspruch nimmt. Um das zu umgehen wäre ein ENUM gut geeignet, das einfach speichert um welche Klasse es sich jetzt handelt.

Wenn es dir nicht auf Geschwindigkeit ankommt, dann kannst du es mit dem instanceof-Operator so gut lösen.
Benutzeravatar
rayman
Beiträge: 76
Registriert: 16.01.2006 20:06
Name: Robert Rasche
Geschlecht: männlich
Studienrichtung: Informationssystemtechnik
Matrikel: 2007
Angestrebter Abschluss: Dipl-Ing.

Re: [Info 2] instanceof - Problem

Beitrag von rayman »

Alex hat geschrieben:Anzumerken wäre noch, dass instanceof-Abfragen meist als schlechter Programmierstil angesehen werden. Der Grund ist einfach, dass eine instanceof-Abfrage vergleichsweise sehr viel Rechenzeit in Anspruch nimmt. Um das zu umgehen wäre ein ENUM gut geeignet, das einfach speichert um welche Klasse es sich jetzt handelt.
Das stimmt nur teilweise. instanceof ist zwar schlechter Programmierstil, aber immer noch besser als eben dieses enum, was die Klassenstruktur wiederspiegelt. Die Verluste von instanceof sind auch nicht so krass, dass man sich Gedanken machen müsste.
Wenn man ein enum nehmen will, brauch man wahrscheinlich nichtmal zwei getrennte klassen.

Der saubere Weg wäre, das Verhalten, dass durch die if-Unterscheidung aufgetrennt wird durch eine separate Methode in der entsprechenden Klasse zu implementieren.

Code: Alles auswählen

class Fahrzeug {
    void do() { /* nix */ }
}

class Auto extends Fahrzeug {
    void do() { ... }
}
...
List<Fahrzeug> liste;
Iterator <Fahrzeug> it = liste.iterator();

while (it.hasNext()) {
    Fahrzeug f = it.next();
    f.do();
    }
}
Es spielt keine Rolle, ob etwas egal, belanglos oder unerheblich ist.
Antworten

Zurück zu „2. Semester: Diskussionen“