Aufgabe 5.3

Praxis-Aufgabe: Kaffee

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Aufgabe 5.3
Also entweder denke ich quer, oder es hat sich ein gewaltiger Fehler im Aufgabenblatt eingeschlichen …

Man soll eine Klasse “Kaffeeverwaltung” erstellen, in der es eine lokale Variable “kaffeesortenFeld” mit den verschiedenen Kaffeesorten gibt.

Jetzt soll man u.a. drei Methoden erstellen, die auf diese Variable zugreifen und eine bestimmte Kaffeesorte daraus ändern, bzw. neu erstellen.
Doch diese Methoden sind static und bekommen das Array nicht migeliefert. Das geht doch überhaupt nicht! Static-Methoden können nicht auf Instanzen und deren Variablen zugreifen!


Prinzipiell gehen tut es schon, ich weiß bloß nicht, ob die tatsächlich so etwas umständliches haben wollten…

Wenn du in einer statischen Methode eine Instanz der Klasse erstellst, kannst du auf die Instanzvariablen dieser Instanz zugreifen.


Das geht zwar schon, aber dann müsstest du 1. diese Instanz zurückgeben und 2. müssten die Variablen public sein und 3. ist aus der Klasse Kaffee.java deutlich heraus zu sehen, dass es sich eigentlich um eine konkrete Instanz handeln soll.

Würde nämlich in deinem Fall keine Instanz der erzeugten Kaffeeverwaltung zurück gegeben werden, dann würde das Ganze einfach gelöscht werden, weil niemand mehr einen Verweis darauf hat.

Ausserdem geht es ja gerade darum EINE Kaffeeverwaltung zu haben, wo alle Kaffeesorten gespeichert werden.


Nein.
Ich kann ja eine private static Kaffeeverwaltung definieren, auf die meine statischen Methoden zugreifen. Dann gibt es zwar genau eine Instanz, aber die ist nach außen hin nicht sichtbar und die Kaffee.java kann weiter auf die statischen Methoden zugreifen.
Und wenn’s mir Spaß macht, kann ich sogar meinen Konstruktor private deklarieren.


Wenn irgend etwas auf eine static-Methode zurgreift und diese dann beendet wird, ohne die Instanz weiter zu geben, dann wird sie vom Garbage Collector gelöscht.

Alternativ müsste Kaffee.java auf diese static-Variable stets eine Referenz halten und diese mit übergeben, was ja klar nicht definiert ist.


Du speicherst das Ganze ja nicht in einer lokalen Variable der Methode, sondern in einer statischen Klassenvariable.
Und die wird erst entsorgt, wenn… Naja, vermutlich bei Programmende oder sowas…

Und alternativ könnte man natürlich auch gleich schreiben:

class Kaffeeverwaltung {
    private static Kaffeeverwaltung blah = new Kaffeeverwaltung();
}

…wobei dann der Sinn der Instanzvariablen natürlich endgültig dahin wäre…


Stimmt. Nur ist es eben nicht sicher, wann diese statische Methode gelöscht werden würde.
Aber wenn man sie nur in der main()-Methode benutzt, würde es wahrscheinlich funktionieren.


Es hindert einen doch niemand einfach alle Methoden und Variablen in der Kaffeeverwaltung static zu machen.
Iss Imho sowieso nicht schlecht, da eigentlich keine Instanz der Kaffeeverwaltung benötigt wird…
Funzt auf jeden Fall alles so bei mir!


Habs auch so gemacht. Funktioniert, und ist denk ich im Sinne des Erfinders (den Aufgabenerstellern)


Naja, eigentlich schon:
Instanzvariable kaffeesortenFeld: Eine Reihung, die 100 Referenzvariablen vom Typ Kaffeesorte enthält.“


Du kannst dir jedenfalls sicher sein, dass die entsprechende Variable genauso lange vorhanden ist wie die Methoden, die darauf zugreifen können. Sollte so gesehen also doch passen!


Hmm seh irgendwie keinen Sinn dahinter, warum die von uns wollen, dass dieses Feld und die anzahlKaffesorten nicht static sein sollen, solange man nur mit einer Kaffeeverwaltung arbeitet.


Abgesehen dvon würde das Programm auch nicht funktionieren wenn die Kaffeeverwaltung nicht komplett static ist,
da die in ihrer Kaffee Klasse nie eine Instanz der Kaffeeverwaltung erzeugen.


Meins geht aber :smiley:
Nein, der Trick ist, die Instanz von Kaffeeverwaltung in einem statischen Kontext innerhalb von Kaffeeverwaltung zu erzeugen → siehe Codeschnipsel oben.


Im allgemeinen wird nicht davon ausgegangen, dass man zusätzliche Methoden/Variablen braucht.
Ich würde wirklich davon ausgehen, dass sich irgendwo ein Fehler eineschlichen hat.

bsp
hoi, kann mir mal bitte jemand ein beispiel angeben wie ich diesen JList befehl
benutze? oder brauch ich nen anderen? (ich mein jetz für die methode aendern() )…bei mir gibt der irgendwie nix aus :#: …thx


Habs so gemacht:

if (was.equals(“sorte”)) {
sorteAendern(neuerEintrag);
return true;
}

thx
yo, verstehs schon, aber hab gedacht es geht einfacher…
im skript steht doch was von JList - Auswahlmenü, aber ich hab doch keine ahnung… :wink:


Ich denk mal, JList gehört ganz woanders hin: zur Programmierung von grafischen Oberflächen.
Und nachdem das erst das nächste Mal drankommen dürfte…

So ist die Lösung von thomas_ sicher das Beste.