Instanzen vergleichen?

Moch

Bekanntes Mitglied
Hallo,
Ich habe folgendes Problem, bei welchem ich absolut nicht weiterkomme -.-

Gegeben sei folgenden Konstruktor:

Code:
public Ampel(){
zustaende = new Zustand[4]  //zustaende bereits in der Klasse definiert mit Zustand[] zustaende;
zustaende[0] = new Rot();
zustaende[1] = new RotGelb();
zustaende[2] = new Grün();
zustaende[3] = new Gelb();
startzustand = zustaende[0];
aktuell = startzustand;
}

Rot, RotGelb usw. sind definierte Konstruktoren, die jeweils einer Unterklasse der abstrakten Klassen Zustand abgehören.

In einer Methode schalteWeiter():void muss ich nun durch die Zustände schalten können, was jedoch daran scheitert, dass ich aktuell nicht mehr zuordnen kann... ist es jetzt gerade Rot(), RotGelb()...?

Die equals() in ihrer Grundform funktioniert hier offensichtlich nicht und wie ich sie anpassen könnte, weiß ich nicht.

Zunächst war mein Ansatz, in die Konstruktoren der Klassen Rot, RotGelb usw. einen String einzufügen, der der Namen der jeweiligen Klasse wiedergibt. Damit hatte ich auch ein vergleichbares Objekt. Eine spätere Aufgabenstellung jedoch macht die Nutzung solcher Objekte unmöglich.
Folglich stehe ich wieder vor dem Anfangsproblem:

Wie kann ich feststellen, welchen der Zustände "aktuell" gerade verkörpert?

lieben Gruß
Moch
 
Zuletzt bearbeitet:

Moch

Bekanntes Mitglied
An instanceOf hatte ich auch schon gedacht, jedoch hat es nicht funktioniert.
Das Problem hier ist, dass es später verschiedene Ampeln geben wird, die eine unterschiedliche Anzahl an Zuständen haben
- Fussgänger mit lediglich rot/grün
- KfZ mit rot/rotgelb/grün/gelb

gemäß Aufgabenstellung ist es nicht erlaubt, die schalteWeiter() in den Unterklassen wieder zu überschreiben.

Daher kann ich hier nicht einfache eine Abfrage

Code:
if (aktuell instanceof Rot)

schreiben, da dies nicht mehr allgemeingültig wäre. Bei der FahrzeugAmpel wäre der FOlgezustand rotgelb und bei einer FußgängerAmpel wäre der Folgezustand grün.

Ich wollte hierbei, wenn möglich explizit mit den Index-Werten des Arrays arbeiten können.
 

njans

Top Contributor
Marcinek meint soetwas:
Java:
public String gibZustandstyp()
{
      return "Rot"; 
      // Das würde so zum Beispiel für Rot aussehen.
      // Natürlich müsstest du diese Methode von jeder Subklasse überschreiben und etwas anderes zurückgeben
      // Wenn du jedoch bereits einen passenden String, int, was auch immer hast, der auch in der Superklasse vorhanden ist
      // kannst du auch einfach diese variable zurückgeben, die ist dann ja bei allen Subtypen anders.
}
 

Moch

Bekanntes Mitglied
Hier tritt wieder genau das Problem auf, das ich bereits in den Aufgabenstellung erwähnte:

Ursprünglich hatte ich mit einem String in jeder der Zustandsklassen gearbeitet und diesen zum Vergleich genutzt.
Dies hat auch bis zu einem bestimmten Punkt sehr gut funktioniert.

Später trat das folgende Problem auf:
- Wir sollen eine AmpelAnlage schreiben (diese erbt von Ampel, besteht aus FussgängerAmpeln und Kfz-Ampeln (beide erben von Ampel)). Hierbei können es endlos viele Ampel sein, die zu einer Anlage zusammengefasst werden.
- Die AmpelAnlage nutzt eine Klasse komponierterZustand, die ebenfalls von Zustand erbt und aus den Zuständen der Ampel besteht (hier nutze ich eine Map mit der jeweiligen Ampel als key und einem Objekt vom Typ Zustand)

Soweit alles noch kein Problem. Einige vorher geschriebene JUnit-Testklassen sollen nun allgemeingültig für sowohl Ampeln, als auch AmpelAnlagen gelten.
Da ich zuvor alle Vergleiche über jene Strings geregelt habe, aber keine eindeutigen String aus dem komponierten Zustand ziehen kann, gelten meine JUnit-Klasse nicht wie gefordert allgemein.

Daher hatte ich die Aufgabe auch (zum dritten Mal mittlerweile -.-) komplett neu angefangen und verfolge nun dieses Konzept.

So langsam weiß ich nämlich auch nicht mehr weiter, wie ich das noch umsetzen soll. Die Aufgabenstellung lässt einerseits den Weg komplett offen, den man wählt, ist dann jedoch durch - teilweise sehr nervige - Bedingungen wieder eingegrenzt...
Ich hätte z.B. die Zustände nicht als eigene Klassen geschrieben, aber das tut nichts zur Sache.

lieben Gruß
Moch
 
Zuletzt bearbeitet:

daNny

Aktives Mitglied
Evtl. wäre es hilfreich, wenn du die genaue Aufgabenstellung mal erläutern würdest ;)

Zumindest mir wären die genauen Vorgaben/Restriktionen jetzt nicht klar!
 

Moch

Bekanntes Mitglied
Ich werde mal versuchen es kurz zu fassen. Es geht hierbei um unsere Klausurvorbereitungsaufgabe, für die es keine Lösung gibt.

Wie sicherlich schon gesehen, geht es um Ampeln

Es handelt sich hierbei NICHT um die Reihenfolge oder den Wortlaut der Aufgaben

1. Es gibt drei Packages: ampeln, zustandsmaschine, test

2. Ampel ist eine abstrakte Klasse, die die Methode schalteWeiter():void beinhaltet
2.1 FussgaengerAmpel und FahrzeugAmpel sind Unterklassen von Ampel
2.1a schalteWeiter soll in beiden NICHT neu geschrieben werden
2.2 Später kommt die abstrakte Unterklasse AmpelAnlage dazu, die die Ampeltypen kombinieren soll (beliebige Anzahl) (hier darf schalteWeiter überschrieben werden)
2.3 Eine Ampel hat einen fest definierten Startzustand und einen aktuellen Zustand

3. Die Klasse Zustand ist abstrakt
3.1 Ihre Unterklassen sind die möglichen Zustände Rot, RotGelb, Gelb, Grün
3.2 Weitere Unterklasse ist komponierterZustand (fasst mehrere Ampeln und deren aktuellen Zustand zusammen und ist Zustand einer Anlage)
3.2a Sie beinhaltet die folgende Methode mit folgender Signatur
public void addZustand(Object key, Zustand zustand);

4. Im Package tests sollen wir verschiedene JUnit-Tests ablaufen lassen, die sowohl für einfache Ampeln, als auch für Anlagen allgemeingültig sind
4.1 sie prüfen, ob alle Zustände erreicht werden, jeder Zustand einen Nachfolger hat und ob nach einer endlich Anzahl von schalteWeiter()-Aufrufen wieder der Startzustand erreicht wird.
-------------------------------------------------------------------------------------------------
Ursprünglich habe ich damit gearbeitet, dass jeder Zustandsklasse im Konstruktor zwei Strings erzeugt:
String aktuell;
String next;
Aktuell entspricht hierbei immer dem Klassennamen und next konnt entweder default sein (FahrzeugAmpel) oder per Übergabe festgelegt sein.
Entsprechend hatte ich alle Vergleiche über diese Strings laufen lassen und auch die JUnit-Tests über die Strings geschrieben.
Sahen zwar abenteuerlich aus, aber funktioniert... hier ein Beispiel:
Code:
if(ampel1.getAktuellerZustand().getAktuell.equals("Rot")) {Anweisungen}

Der KomponierteZustand, von mir als HashMap umgesetzt, jedoch kann keinen solchen String zurückgeben, da er aus mehreren Zuständen besteht.
Foglich waren alle meine Vergleiche, die eben über die Strings liefen, nicht mehr allgemeingültig.

Dadurch habe ich neu angefangen und wollte einen Ansatz wählen, in welchem Strings keine Rolle mehr spielen, was den Vergleich angeht.
Einen String gegen sie jetzt auch noch aus, jedoch nur für mich zu Testzwecken.

Daher war mein Ansatz ein Array aufzubauen, um zunächst die schalteWeiter allgemein zu implementieren ... hierbei scheitere ich jedoch schon daran, dass ich nicht mehr prüfen kann, zu welchem Objekt aktuell gerade gehört.
Baue ich hier wieder einen String ein, renne ich mit dem komponiertenZustand erneut gegen eine Wand, was die Allgemeingültigkeit meiner Vergleiche und meine JUnit angeht.

lieben Gruß
Moch
 
Zuletzt bearbeitet:
G

Gast2

Gast
Hmmm, irgendwie finde ich das Design merkwürdig?

Ampel ist ein abstrakte Klasse, Fußgängerampel und Fahrzeugampel erben davon. Soweit gut. Aber warum ist dann eine Ampelanlage auch eine Unterklasse von Ampel? Und warum wieder abstrakt? Ich würde eher davon ausgehen das eine Ampelanlage ein von Ampel unabhängiges Objekt ist und eine Set von Ampel Objekten vereinigt. Anders macht das wenig Sinn meiner Meinung nach.

Ebenso die Klasse Zustand. Warum wider Unterklassen die Ampeln enthalten? In meiner Sicht der Welt hat eine Ampel einen Zustand und nicht ein Zustand eine Ampel? Das mag vielleicht bei dem Konzept der Ampelanlage gut klingen da der Zustand dann für eine Ampelanlage gilt und somit mehrere Ampeln und ihre Zustände erfasst, aber insgesammt doch recht merkwürdig.

Ich würde eher sagen:
Ampel - Interface oder abstrakte Klasse, jede Ampel hat ein Attribut Zustand (+ evtl Startzustand wenn nötig) und eine Liste gültiger Nachfolgezustände wie ein Automat.
Fußgängerampel, Fahrzeugampel, Bahnampel, etc - konkrete Implementierungen oder Klassen die von Ampel erben

Ampelanlage - Hat als Attribut eine Menge Ampeln, kann ihren Zustand abfragen, gültige Nachfolgezustände und somit alle Ampeln die zu der Anlage gehören schalten. Die sollte auch nicht abstrakt sein. Ich möchte doch eine Ampelanlage erzeugen? Könnt mir jetzt nichtvorstellen welche Klasse ich davon erweitern könnte damit das Sinn macht.

Zustand dann einfach als Enum von Ampelfarben/Signalen.
 
Zuletzt bearbeitet von einem Moderator:

Moch

Bekanntes Mitglied
Wie gesagt: Leider ist die Aufgabenstellung NICHT optional und leider genau so vorgegeben. Ich bin davon auch nicht sonderlich begeistert :-( - entspricht nicht dem Stil, mit welchem ich Programme schreibe...
Fakt ist aber: Ich soll es gemäß der Aufgabenstellung umsetzen und die Prüfung wir entsprechend darauf aufbauen bzw. sehr ähnliche Dinge verlangen.
 

Noctarius

Top Contributor
Die Bezeichner in der Aufgabenstellung sind, abgesehen vom allgemeinen Design, genauso merkwürdig. Wenn schon Jemand Klassennamen mit Umlauten vorgibt (abgesehen von den sonst deutschen Bezeichnern) gehört die Person erschossen -.-

Was du suchst dürfte eine Art kleiner Statemachine sein. Darin kannst du dann Flows definieren. Dann musst du nur die Zustandsübergänge definieren.

Endlicher Automat ? Wikipedia
 

schalentier

Gesperrter Benutzer
Das Problem an der Aufgabenstellung ist, dass Zustaende ueber Klassen abgebildet sind. D.h. man kann beliebig viele Rot-Zustaende erzeugen, was jedoch vollstaendig dem Sinn eines Zustands (den gibts nunmal nur genau einmal) widerspricht. Dafuer nimmt man entweder Konstanten (public static final int ROT=1) oder besser Enums.

Wenn du daran nicht ruetteln kannst oder darfst, koenntest du evtl. sowas machen. Aber Vorsicht, dass ist ganz grosser Bockmist:
Java:
public abstract class Zustand {
   public boolean equals( Object z ) {
      if( z instanceof Zustand ) {
         return this.getClass()==z.getClass();
      }
      return false;
   }
}

Dann kannste sowas schreiben:
Java:
Zustand aktuell = new Rot();

if( aktuell.equals(new Rot()) ) { ... }

Zudem koenntest du eine Methode [c]getNextZustand()[/c] in die Klasse Zustand einbauen
Java:
public abstract class Zustand {
   public abstract Zustand getNextZustand();
}
public class Rot extends Zustand {
   public abstract Zustand getNextZustand() {
      return new RotGelb();
   }
}
...
 
Zuletzt bearbeitet:

Moch

Bekanntes Mitglied
Ich möchte mich nochma herzlich für die Hilfe hier bedanken!
Für die Klausur hat unser Ansatz funktioniert bzw. ausgereicht.
Problem war natürlich, dass der Prüfer einen ganz anderen Ansatz gefahren hat, aaber trotzdem hat es gepasst.
Vielen, vielen Dank!

Jetzt geht's an die Übung für das große Programmierprojekt im Herbst :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Klassen Instanzen einer Klasse in einer anderen unabhängigen Klasse nutzen Java Basics - Anfänger-Themen 4
G zwei Instanzen einer Klasse Java Basics - Anfänger-Themen 29
C Was machen mit nicht mehr verwendeten Instanzen ? Java Basics - Anfänger-Themen 18
C Instanzen, wann muss ich Instanzen erzeugen & wo?) Java Basics - Anfänger-Themen 23
A Klassen Zugriff auf Instanzen Java Basics - Anfänger-Themen 2
F Mehrere Instanzen der Klasse A EINER Instanz der Klasse B übergeben Java Basics - Anfänger-Themen 3
M Alle Instanzen einer Klasse ansprechen Java Basics - Anfänger-Themen 4
H Erste Schritte JTree: Instanzen einer Klasse speichern oder Namen/Strings... Java Basics - Anfänger-Themen 4
B OOP Summe aus verschiedenen Instanzen einer Klasse berechnen Java Basics - Anfänger-Themen 2
Z Was habe ich davon mit einem Datentyp verschiedene Instanzen zu haben? Java Basics - Anfänger-Themen 6
Q OOP Mehrere Instanzen auf ein Feld Java Basics - Anfänger-Themen 13
G Instanzen eines Interfaces erzeugen Java Basics - Anfänger-Themen 7
S Direkt Instanzen anlegen Java Basics - Anfänger-Themen 1
K Variablen Instanzen gleich aber warum ? Java Basics - Anfänger-Themen 3
D Instanzen durch Methode Java Basics - Anfänger-Themen 14
W Zugriff auf Instanzen von Klassen Java Basics - Anfänger-Themen 8
S aus Text Datei Instanzen erzeugen, so richtig? Java Basics - Anfänger-Themen 4
O Liste aller Instanzen einer Klasse Java Basics - Anfänger-Themen 18
H Klassen Instanzen mit anderen Klassen erzeugen Java Basics - Anfänger-Themen 5
C Referenzen zu Instanzen einer Klasse im Array Java Basics - Anfänger-Themen 8
B Enum: Instanzen Java Basics - Anfänger-Themen 10
H Klassen, Konstruktoren, Instanzen etc Java Basics - Anfänger-Themen 6
W Instanzen, Klassen Java Basics - Anfänger-Themen 2
C Vectorarrays und Instanzen Java Basics - Anfänger-Themen 10
S alle instanzen einer klasse löschen Java Basics - Anfänger-Themen 18
C OOP Instanzen ansprechen Java Basics - Anfänger-Themen 3
P Verständnisfrage zu Instanzen/Objekten Java Basics - Anfänger-Themen 9
B Zugriff auf Variablen in nicht bekannten Instanzen Java Basics - Anfänger-Themen 6
R mit klassen-instanzen arbeiten in packages Java Basics - Anfänger-Themen 10
M Instanzen, Referenzen und Collections Java Basics - Anfänger-Themen 3
A Mehrere Instanzen einer eigenen Klasse in einem Array Java Basics - Anfänger-Themen 5
W mehrere (numerierte) Instanzen erzeugen Java Basics - Anfänger-Themen 3
M Dynamisch Instanzen erstellen. Java Basics - Anfänger-Themen 4
N Instanzen von beliebigen Klassen aus dem Filesystem erzeugen Java Basics - Anfänger-Themen 7
M Problem mit Instanzen von JLabel Java Basics - Anfänger-Themen 4
E Vermeiden,dass mehrere Instanzen eines Java-Programms laufen Java Basics - Anfänger-Themen 2
V mehrere Instanzen gleicher Name möglich? Java Basics - Anfänger-Themen 3
E instanzen von Klassen erzeugen Java Basics - Anfänger-Themen 2
H Instanzen erzeugen und Methoden aufrufen Java Basics - Anfänger-Themen 5
L verschiedene JPanel-Instanzen erstellen Java Basics - Anfänger-Themen 8
K Eindeutige Instanzen von einem Objekt Java Basics - Anfänger-Themen 13
T Wo Daten ablegen für mehrere Servlet-Instanzen? Java Basics - Anfänger-Themen 2
G Instanzen in einem Feld erzeugen Java Basics - Anfänger-Themen 9
J Instanzen dynamisch erzeugen Java Basics - Anfänger-Themen 8
T Instanzen von abstrakten Klassen? Java Basics - Anfänger-Themen 14
D Instanzen einer Klasse Java Basics - Anfänger-Themen 6
G Speicherung von Referenzen auf Instanzen Java Basics - Anfänger-Themen 5
G alle Instanzen einer Klasse serialisieren Java Basics - Anfänger-Themen 4
Silver-Blue mehrere Instanzen einer Klasse, trotz Random immer das Selbe Java Basics - Anfänger-Themen 7
W Instanzen herunterzählen Java Basics - Anfänger-Themen 7
G Instanzen und Referenzen Java Basics - Anfänger-Themen 5
S Instanzen Java Basics - Anfänger-Themen 4
G wenn auch schon oft gefragt (Konstruktor , Instanzen , usw) Java Basics - Anfänger-Themen 6
M Vergleichen, ob eine Liste länger als andere ist Java Basics - Anfänger-Themen 6
E Arrays in einer ArrayList miteinander vergleichen Java Basics - Anfänger-Themen 12
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
I 2 verschiedene Klassen mit gleichen Property vergleichen Java Basics - Anfänger-Themen 13
J 2 listen vergleichen, die auch null Elemente haben können ! Java Basics - Anfänger-Themen 9
J ArrayList vergleichen im spiel Mastermind Java Basics - Anfänger-Themen 2
J Array.list vergleichen Java Basics - Anfänger-Themen 1
M 3 Zahlen miteinander vergleichen Java Basics - Anfänger-Themen 18
S Inhalte aus Array vergleichen und Max ausgeben Java Basics - Anfänger-Themen 3
B bei 2 Arrays Anzahl gleicher Elemente vergleichen? Java Basics - Anfänger-Themen 49
W LocalDate vergleichen mit Equals? Java Basics - Anfänger-Themen 7
S mehrere TreeSets so speichern, dass man sie miteinander vergleichen kann Java Basics - Anfänger-Themen 1
ArrayList mit unbekannter Menge an Arrays die Arrays vergleichen Java Basics - Anfänger-Themen 9
M String mit Variable vergleichen Java Basics - Anfänger-Themen 9
O Array mit einem Zeichen vergleichen Java Basics - Anfänger-Themen 1
S String mit Int input vergleichen Java Basics - Anfänger-Themen 5
S Den Minimumberechnen 2 codes vergleichen Java Basics - Anfänger-Themen 4
S Chars vergleichen ohne Betrachtung der Groß und Kleinschreibung Java Basics - Anfänger-Themen 7
S Aktuell beste Methode um zwei Bilder zu vergleichen..? Java Basics - Anfänger-Themen 1
A 2 Strings vergleichen in einer methode wenn man mit Globalen variablen arbeitet Java Basics - Anfänger-Themen 12
districon Vergleichen von Objekten Java Basics - Anfänger-Themen 20
Bademeister007 Elemente aus zwei verschiedenen Arrays miteinander vergleichen und gegeben falls entfernen Java Basics - Anfänger-Themen 14
M Strings vergleichen Java Basics - Anfänger-Themen 10
J Zufallszahlen generieren und Werte vergleichen Java Basics - Anfänger-Themen 3
Stephan_kl Reihenwert-Berechnung, Ergebnis mit vorherigem Ergebnis vergleichen Java Basics - Anfänger-Themen 11
J Zwei Objekte vergleichen Java Basics - Anfänger-Themen 8
R Werte und Reihenfolge in 2d Arrays vergleichen Java Basics - Anfänger-Themen 5
JaVaN0oB Wörterraten - Falsche Ausgabe, String/Chars vergleichen Java Basics - Anfänger-Themen 2
O String mit Character vergleichen Java Basics - Anfänger-Themen 3
S 2 Strings mit Equals vergleichen Java Basics - Anfänger-Themen 11
N 2D Arrays jedes xy vergleichen Java Basics - Anfänger-Themen 7
M Objekte mittels equals vergleichen Java Basics - Anfänger-Themen 14
J zwei String Arrays miteinander vergleichen Java Basics - Anfänger-Themen 18
F Eine Zahl mit Arrays vergleichen Java Basics - Anfänger-Themen 7
D Vergleichen von Strings Java Basics - Anfänger-Themen 6
M Objekte miteinander vergleichen Java Basics - Anfänger-Themen 18
M Matrix Elemente vergleichen Java Basics - Anfänger-Themen 11
I Alle Elemente von zwei Listen vergleichen Java Basics - Anfänger-Themen 1
R String vergleichen Java Basics - Anfänger-Themen 59
S Vergleichen ob der Integer der benutzt eingeben werden soll überhaupt ein int ist Java Basics - Anfänger-Themen 1
C System.in.read() Boolsche Werte vergleichen Java Basics - Anfänger-Themen 8
K Boolean in einer Methode um 2 Objekte zu vergleichen Java Basics - Anfänger-Themen 12
N Zwei Daten (Datum) miteinander vergleichen, abspeichern, laden Java Basics - Anfänger-Themen 4
A Daten auslesen/vergleichen Java Basics - Anfänger-Themen 3
J Strings untereinander in einer Liste vergleichen Java Basics - Anfänger-Themen 18
E Zahlen von einem Array mit zahlen von zweitem Array vergleichen Java Basics - Anfänger-Themen 27
A Suffix vergleichen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben