Eigenschaften Werte, in einer anderen Klasse, zuweisen

Hallo, ich sitze gerade an meinem ersten Projekt und bin frühzeitig auf ein Problem gestoßen das mir jetzt seit Wochen kopfzerbrechen beschert. Ich habe schon alles mögliche gegoogelt, aber kann keine Lösung für mein Problem finden.
Ich möchte ein Programm mit Kochrezepten machen. Dafür erstelle ich eine Klasse mit allen Zutat, diese kann ich aber nicht über den Konstruktor weiter geben sondern muss Methoden in einer anderen Klasse (Dessert) dafür machen (da ich sonst 600 Zutaten für ein Rezept bräuchte). Jetzt komme ich an das Problem das ich den Zutaten keine Werte übergeben kann da das Tool in den Parametern es nicht zulässt das ich darauf zugreife. Ich kann sie zwar mit zutaten.getSahne() ausgeben, aber Werte kann ich keine übergeben, und somit kommt es zu einer null Pointer Exception. Wäre gut wenn ihr mir hier helfen könnt und ich hoffe das ich alles so beschreiben konnte das es verständlich ist.
Vielen Dank schon mal im Vorraus.

Java:
package zutaten;

public class Zutaten {

    protected int sahne;
    protected int zucker;
    protected int gelatine;
    protected int orange;
    protected int zitrone;
    protected int a;
    protected int b;
    protected int c;

    public int getSahne() {
        return sahne;
    }

    public int getZucker() {
        return zucker;
    }

    public void setSahne(int sahne) {
        this.sahne = sahne;
    }

    public void setZucker(int zucker) {
        this.zucker = zucker;
    }
}
Java:
package zutaten;

public class Dessert {

    public Zutaten zutaten;


    public String panna() {
        return "Sahne: " + zutaten.getSahne() + " Zucker: " + zutaten.getZucker();
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Du solltest Code so posten, wie von @Tobias-nrw gezeigt, ansonsten kann es passieren, dass bestimmte Teile des Codes z. B. als Formatierungen interpretiert werden und somit verloren gehen.
 
Kann deinen Hinweis nicht verstehen.
Der bezog sich nur darauf, dass du deinen Code innerhalb einer Tabelle gepostet hast, und nicht als Code. Ich hab das gefixt, da du das nicht mehr bearbeiten konntest.


Bin über jede Info froh mit der ich arbeiten kann und die mich ein Stück weiter bringt.
Deine Erklärung ist etwas verwirrend (zB die 600 Zutaten für ein Rezept), genauso wie der Code aktuell nicht sinnvoll ist.

Wenn du es vernünftig machen willst, solltest du noch mal einen Schritt zurück gehen, und dir überlegen, wie man es sinnvoll modellieren kann. z.B. "ein Rezept hat mehrere Zutaten, eine Zutat hat immer einen Namen ("Zucker") und eine Menge (200gr) - das ganze lässt sich recht einfach in Code überführen.
 
Bin über jede Info froh mit der ich arbeiten kann und die mich ein Stück weiter bringt.
Gemeint ist, dass der gepostete Code beim Nachbauen (z.B. mit Eclipse) nicht vollständig ist idS. das keine Fehlermeldung erscheint und der Code auch keine anderen Ausgaben erzeugt. Irgendwo in Dessert.java könnte z.B. eine main-Funktion stehen...
 
Der bezog sich nur darauf, dass du deinen Code innerhalb einer Tabelle gepostet hast, und nicht als Code. Ich hab das gefixt, da du das nicht mehr bearbeiten konntest.



Deine Erklärung ist etwas verwirrend (zB die 600 Zutaten für ein Rezept), genauso wie der Code aktuell nicht sinnvoll ist.

Wenn du es vernünftig machen willst, solltest du noch mal einen Schritt zurück gehen, und dir überlegen, wie man es sinnvoll modellieren kann. z.B. "ein Rezept hat mehrere Zutaten, eine Zutat hat immer einen Namen ("Zucker") und eine Menge (200gr) - das ganze lässt sich recht einfach in Code überführen.
So wie du es erklärt hast („ein Rezept hat mehrere Zutaten, eine Zutat hat immer einen Namen ("Zucker") und eine Menge (200gr) - das ganze lässt sich recht einfach in Code überführen“) ist es mir schon klar. Nur wie bekomme ich die Zutat in die Klasse Dessert, das ich ihr einen Wert übergeben kann? Momentan versuche ich für jedes Dessert eine eigene Methode zu machen, aber in der Methode habe ich keinen Zugriff auf die Zutaten. Wenn du einen Vorschlag hast wie ich das Problem anders lösen kann bin ich auch sehr froh, habe mich vollkommen verrannt und komm nicht mehr weiter.
Und sorry für die verwirrenden Erklärungen (sobald was unklar ist erkläre ich es gern nochmal, ich will nur mit dem Projekt weiter kommen).
 
So wie du es erklärt hast („ein Rezept hat mehrere Zutaten, eine Zutat hat immer einen Namen ("Zucker") und eine Menge (200gr) - das ganze lässt sich recht einfach in Code überführen“) ist es mir schon klar.
Dann setz das doch erstmal um 🙂



Nur wie bekomme ich die Zutat in die Klasse Dessert
Indem du die Zutaten für ein Rezept dem Rezept im Konstruktor übergibst 🙂
Wenn du einen Vorschlag hast wie ich das Problem anders lösen kann bin ich auch sehr froh, habe mich vollkommen verrannt und komm nicht mehr weiter.
Wie gesagt: lösch was du bisher hast, und fang noch mal neu an, mit dem Satz, den du von mir zitiert hast
 
Dann setz das doch erstmal um 🙂




Indem du die Zutaten für ein Rezept dem Rezept im Konstruktor übergibst 🙂

Wie gesagt: lösch was du bisher hast, und fang noch mal neu an, mit dem Satz, den du von mir zitiert hast
„Indem du die Zutaten für ein Rezept dem Rezept im Konstruktor übergibst 🙂
Ich habe für die Klasse Dessert alleine 100 Rezepte, wenn ich es mit dem Konstruktor mache brauche ich für jedes Rezept entweder 600 Zutaten, weil ich alle mitgeben muss oder, wenn ich den Konstruktor überlade, scheitere ich spätestens dann wenn ich die selbe Anzahl an Eigenschaften (die alle vom Typ int sind) mitgebe. Oder übersehe ich da gerade etwas fundamentales?
 
Oder übersehe ich da gerade etwas fundamentales?
Ja, das was du aktuell hast, hat nichts mit "ein Rezept hat mehrere Zutaten, eine Zutat hat immer einen Namen ("Zucker") und eine Menge (200gr)" zu tun 😉

Du hast aktuell eine Klasse Zutaten, die alle Zutaten auf einmal darstellt, und eine Klasse Dessert, die alle Desserts auf einmal darstellt.


Setz einfach mal ganz Stumpf dieses um: "ein Rezept hat mehrere Zutaten, eine Zutat hat immer einen Namen ("Zucker") und eine Menge (200gr)" (Als Hinweis: Nomen kann man in Klassen überführen, 'hat XY' stellt man sinnvoll als Attribut dar)
 
Ja, das was du aktuell hast, hat nichts mit "ein Rezept hat mehrere Zutaten, eine Zutat hat immer einen Namen ("Zucker") und eine Menge (200gr)" zu tun 😉

Du hast aktuell eine Klasse Zutaten, die alle Zutaten auf einmal darstellt, und eine Klasse Dessert, die alle Desserts auf einmal darstellt.


Setz einfach mal ganz Stumpf dieses um: "ein Rezept hat mehrere Zutaten, eine Zutat hat immer einen Namen ("Zucker") und eine Menge (200gr)" (Als Hinweis: Nomen kann man in Klassen überführen, 'hat XY' stellt man sinnvoll als Attribut dar)
Als erstes Mal, Danke für deine Antworten und vor allem Geduld! Bevor du glaubst das ich total behindert bin will ich dir nur sagen das ich seit einem Monat ohne freie Tage, á 10h durcharbeite. Da fällt es irgendwann schwer sich zu konzentrieren.

Zusammenfassend:

Ich erstelle eine Klasse Rezept, in dieser Klasse erstelle ich mir meine Rezepte mit den Zutaten als Eigenschaften. Die Zutatenklasse fällt komplett weg. Die Rezepte übergebe ich dann an die Klasse Dessert.

Meinst du es so oder bin ich immer noch auf dem Holzweg?
 
Ich würde das eigentlich auch hierarchisch flach halten. Soll bedeuten, es gibt eine Klasse Gericht welches du kochen möchtest. Ein Gericht hat einen Namen, ggf eine Kategorie, Bewertungen, Zubereitungszeiten, Anzahl der Personen - und - ganz wichtig - eine Liste mit Zutaten und Mengenangaben. Dafür könnte man eine Klasse Zutat anlegen - und diese wiederum noch splitten in volumetrische (Milliliter) und gravimetrische (Gramm) Zutaten...
Ist das besser verständlich?
 
Ich würde das eigentlich auch hierarchisch flach halten. Soll bedeuten, es gibt eine Klasse Gericht welches du kochen möchtest. Ein Gericht hat einen Namen, ggf eine Kategorie, Bewertungen, Zubereitungszeiten, Anzahl der Personen - und - ganz wichtig - eine Liste mit Zutaten und Mengenangaben. Dafür könnte man eine Klasse Zutat anlegen - und diese wiederum noch splitten in volumetrische (Milliliter) und gravimetrische (Gramm) Zutaten...
Ist das besser verständlich?
Ich übernehme deine Idee mal so wie du sie geschildert hast, weil das am Anfang genau meine Idee war. Wie würdest du die Zutaten Klasse aufbauen, alle die anfallen einfach als Eigenschaften deklarieren?
Wie bekommst du die Zutaten in deine Gerichtklasse? Das ist für mich der entscheidende Punkt den ich nicht hinbekomme.

Nachfolgend ein paar Wege die ich versucht habe, aber nicht geklappt haben:

1. Vererbung fällt raus, da es sich um aggregation handelt. Und wenn ich die Zutaten Klasse als Eigenschaft, in der Rezeptklasse, deklariere, kann ich zwar über getter darauf zugreifen aber mit settern keine werte übergeben. Ich könnte dann zwar alle Rezepte in der Zutatenklasse erstellen aber das ist total sinnlos.

2. Mache ich einen konstruktor mit nur den Werten die ich pro Rezept benötige (also überladen) funktioniert es nicht mehr sobald ich die selbe Anzahl an Parametern mitgebe (weil der Compiler nicht weiß welchen konstruktor er verwenden soll, da alle den selben Rückgabetyp haben).

3. Gebe ich dem konstruktor alle Eigenschaften mit will er bei der Objekterstellung auch für jede Eigenschaft einen Wert haben. Macht natürlich auch keinen Sinn für ein Dessert Rinderhüfte einzusetzen.

Ich kann ein einzelnes Gericht, mit seinen Zutaten, ohne Probleme mit dem konstruktor erstellen. Das Problem ist sobald es mehrere werden, da ich den konstruktor dann nicht mehr verwenden kann da ich Methoden benötige. Über die objekterstellung greife ich dann auf die Methode zu um sie zu initialisieren.
 
Dein Rezept besteht nicht aus einer Zutat oder zwei, drei, vier Zutaten, sondern Dein Rezept besteht (unter anderem) aus einer Zutatenliste. Folglich hätte Dein Konstruktor einen Parameter, der eine Zutatenliste erwartet.
 
@Entremetier82
Mir kommt es so vor, als hätteste du den Unterschied zwischen Klasse und Objekt noch nicht richtig verinerlicht. Deine Klasse "Rezept" ist etwas abstraktes. Es hat Variablen wie z.B eine Liste von Zutaten und eine Beschreibung für die Zubereitung. Wenn du die Klasse Rezept anschaust, weißt du nicht, was daraus gekocht ist, weil deine Variablen leer sind.
Nachdem die Klasse fertig ist, kannst du mit dem Konstruktor ein Objekt, in deinem Fall eine Ausprägung des Rezeptes machen. Dazu musst du dem Objekt sagen, was es als Zutatenliste enthält und welche Beschreibung es enthält.

Genauso ist es für die Klasse Zutat. Eine Zutat hat einen Namen und eine Menge. Wenn die Klasse fertig ist, weißt du nicht, welche Zutat sie darstellen soll. Im späteren Programmverlauf machst du es konkreter und konstruirst ein Objekt Zutat mit dem Namen und der Menge.

Grüße
 
Ich bin mal so gut
Java:
class Rezepte {
	public static void main(String[] args) {
		List<Rezept> rezepte = new LinkedList<Rezept>(Stream.of(
				new Rezept("Fischsuppe", new Zutat("Fisch")),
				new Rezept("Kartoffelsuppe", new Zutat("Kartoffeln", 5)),
				new Rezept("Milchsuppe", new Zutat("Milch", Einheit.MILLILITER, 1000))
					).collect(Collectors.toList()));
		for (Rezept rezept : rezepte) {
			System.out.println(rezept);
		}
	}

}

class Rezept {
	String name;
	Zutat[] zutaten;

	Rezept(String name, Zutat... zutaten) {
		this.name = name;
		this.zutaten = zutaten;
	}

	@Override
	public String toString() {
		return "Rezept [name=" + name + ", zutaten=" + Arrays.toString(zutaten) + "]";
	}

}

class Zutat {
	String name;
	int menge;
	Einheit e = null;
	int einheiten = 0;

	Zutat(String name) {
		this(name, 1);
	}

	Zutat(String name, int menge) {
		this.name = name;
		this.menge = menge;
	}

	Zutat(String name, Einheit e, int einheiten) {
		this(name, 1);
		this.e = e;
		this.einheiten = einheiten;
	}

	@Override
	public String toString() {
		return "Zutat [name=" + name + ", menge=" + menge + ", e=" + e + ", einheiten=" + einheiten + "]";
	}

}

enum Einheit {
	MILLILITER, GRAMM
}
 
Ja, ich dachte Java >=11 wäre jetzt Pflicht. Hatte auch eine 1.5er Version, ohne diesen neuen modischen Kram.
Bzgl. des Codes: Ist denn Code nun unangebracht?
 
Rezept!, nicht Gericht und nicht Speise... wieso ist mir das Wort gestern nicht eingefallen? Denkblockade. 😡
Keine Ahnung, ich hab nicht nachgedacht sondern einfach von den Posts davor abgeschrieben 😛

Bzgl. des Codes: Ist denn Code nun unangebracht?
Das kann ja jeder halten, wie er will. Nach seinem Kommentar #17 war ich auch schon kurz davor, Code zu zeigen, weil anscheinend ein paar grundlegende Wissenslücken bestehen, die mit abstrakten Erklärungen schwer aufzufüllen sind wie z. B. die konkrete Verwendung von List. Allerdings hätte man den Spaß auch mit einem anderen Beispiel verdeutlichen können, dann hätte er seine graue Masse noch ein wenig in Bewegung setzen müssen.
 
Danke für eure Hilfe, so habe ich es einfach nicht gesehen. Ich habe immer das fertige Rezept, mit seinen Zutaten, vor Augen gehabt. Das ich die Zutat als einzelnes programmieren muss habe ich so nie wahrgenommen und wäre so auch nie darauf gekommen. Für mich, als Koch, ist die kleinste Einheit die Zutat. Das ist es wohl was man, nach 20 Jahren kochen, betriebsblind nennt. Ist auf jeden Fall ein Fehler der mir so schnell nicht wieder passiert. Nochmals tausend dank für eure Geduld und Hilfe und sorry für die Mühe die ihr mit mir habt.
 
Für mich, als Koch, ist die kleinste Einheit die Zutat. Das ist es wohl was man, nach 20 Jahren kochen, betriebsblind nennt.
Oh, das kann durchaus auch daran liegen, dass "Zutat" eben ein Fachbegriff ist, mit dem einfach nur der Stoff bezeichnet wird, der Teil des Rezepts ist. Wir haben den Spaß laienhaft betrachtet und als "Zutat" einfach mal den Eintrag in der Zutatenliste definiert.
 
Einen Schritt weiter gedacht, könnte man die Zutat auch persistieren. Er möchte ja vielleicht schnell mal seine Rezepte speichern, so dass er sie jederzeit wieder zurückholen kann und mit ihnen weiter machen kann. Da würde sich eine Datenbank oder eine Datei anbieten. Oder wie siehst Du es, mihe7?
 
Die Wahrscheinlichkeit ist hoch. Aber vielleicht sucht er sich nur auf irgendwelchen Internetrezeptsammlungportalseiten per REST API irgendwelche Rezepte zusammen und will jetzt per Machine Learning neue Rezepte generieren und anzeigen lassen. App: ein Button "Was koche ich heute?" 🙂
 
Natürlich gibt es solche vergleichbaren Angebote schon auf Portalen im Internet, aber es wäre doch schöner wenn er es sich selber schreiben kann und dann ein Erfolgserlebnis zeigen kann. Oder meinst du er besorgt sich zunächst nur die Daten von dort um nicht alles alleine machen zu müssen?
 
Genau. Button "Was koche ich heute?" -> ruft aus verschiedenen Quellen Zutaten verschiedener, zufällig gewählter Rezepte ab -> werden in sein Modell überführt -> dann kommt der ML-Algorithmus zum Einsatz -> und schon bekommt er das Rezept zu "Gulasch Carbonara mit Schokocreme" angezeigt 🙂
 
Also das wird mir zu schwierig für mein erstes Projekt.
Es geht mir darum meine eigenen, über tausend, Rezepte in das Programm zu bekommen. Als Endziel sehe ich es als App für Köche die in einem kleinen Restaurant eine Ausbildung machen, wo es nicht diese Möglichkeiten gibt wie bei mir im 5 Sterne Hotel. Sie sollen damit einen Zugang zu erprobten Rezepten haben, die funktionieren damit sie neues lernen können (habe viele kochstile und auch Sushi gelernt und will mein Wissen weiter geben an Leute die nicht die Möglichkeiten haben wie ich sie hatte und sie damit die Freude am Beruf kennenlernen und kreative Köche werden). Habe mich jetzt ein paar Monate mit Java beschäftigt (aber scheinbar nicht genug ) und möchte es jetzt umsetzen. Ich weiß das noch andere Schwierigkeiten auf mich zukommen, aber ich werde es lernen während ich es mache. Selbst wenn ich am Ende nur eine Person damit erreiche und sie was daraus macht, hat es sich dann doch gelohnt weil diese Person ihre Freude und wissen an andere weiter gibt.
 
Also noch zwei Dinge,
1. der Textteil/die Zubereitungsanleitung - wichtig - fehlt oben noch,
2. der gezeigte Codeausschnitt war erst 10 % von dem Code, der dafür noch benötigt wird...
(3. das ist in der Tat sehr umfangreich, aber vielleicht können wir Dir dabei etwas helfen.)
..
4. ggf. kann man aus dem Texteil auch nochmal in Klassen aufteilen. Einige Dinge sind ja ähnlich, umrühren, backen, zerkleinern usw. (kenne mich mit Kochen 0 aus)
 
@Tobias-nrw Ihr habt mir jetzt schon sehr geholfen das Projekt auf einen guten Weg zu bekommen. Sollte ich mich aber mal wieder so verrennen, dann nehme ich eure Hilfe gerne an. Aber immer daran denken das es mein erstes Projekt ist. Und wenn du Fragen zum Thema kochen hast, kannst mich jederzeit fragen.
 
Also das wird mir zu schwierig für mein erstes Projekt.
Rom wurde nicht an einem Tag erbaut. Das wird schon, man muss es nur langsam und schrittweise angehen.

Die erste Frage wäre für mich, was der Benutzer mit der Anwendung denn machen können soll. Geht es nur darum, eine statische Rezeptsammlung anzuzeigen? Dann ist im allereinfachsten Fall ein Rezept einfach nur Text (unstrukturierte Daten).

Ansonsten gilt als Daumenregel: je strukturierter, desto mehr Möglichkeiten aber auch mehr Aufwand.
 
Rom wurde nicht an einem Tag erbaut. Das wird schon, man muss es nur langsam und schrittweise angehen.

Die erste Frage wäre für mich, was der Benutzer mit der Anwendung denn machen können soll. Geht es nur darum, eine statische Rezeptsammlung anzuzeigen? Dann ist im allereinfachsten Fall ein Rezept einfach nur Text (unstrukturierte Daten).

Ansonsten gilt als Daumenregel: je strukturierter, desto mehr Möglichkeiten aber auch mehr Aufwand.
Erstmal soll der User nur an die Rezepte kommen. Wenn ich mich bis dahin durchgeschlagen habe sollen die einzelnen Rezepte, nach Themen oder Herkunft, zu Menüvorschlägen und Buffets zusammen kommen, die dann auch die Allergene beinhalten. Da ich oft mit exotischen Zutaten (habe unter anderen asiatische Küche gelernt) arbeite kommt noch eine Klasse hinzu in der diese Zutaten erklärt werden (Herkunft, wie man es verarbeitet und Bilder), aber das ist für mich noch in weiter ferne.
Also erstmal alles sehr einfach gehalten um Basics besser zu verstehen und die Dinge aus programmatischer Sicht zu sehen und nicht als Koch.
 
Also erstmal alles sehr einfach gehalten
Als sehr einfach würde ich das nicht bezeichnen. Du hast aber schon eine sehr gute Vorstellung von dem, was Du haben willst und scheinst strukturiert zu denken - das sind schon sehr gute Voraussetzungen.

Wie ist das mit den Mengenangaben, die sind doch bestimmt auf eine bestimmte Zahl an Personen/Portionen ausgelegt, oder? Das muss vermutlich auch ins Rezept - und ermöglich dann ggf. eine Umrechnung.

Dann müsstest Du noch festlegen, welchen Begriff Du für Zutat (als Stoff) bzw. für Zutat als Angabe in einem Rezept (sprich: mit Menge) verwenden willst. Gibts da Fachbegriffe?
 
Mengenangaben werde ich später umrechnen, ein Koch kann es sich, anhand des Rezeptes selbst ausrechnen für wieviele Leute es reicht, aber eine Umrechnung soll zum späteren Zeitpunkt erfolgen.
 
Dann besteht ein Rezept wohl aus:
1. einem Titel
2. der Anzahl an Personen, für die das Rezept gedacht ist
3. einer Zutatenliste
4. der Zubereitung (reicht Text oder brauchst Du diese strukturiert in einzelne Schritte?)

Eine Zutatenliste aus beliebig vielen Einträgen, die jeweils enthalten:
1. eine Menge
2. eine Mengeneinheit
3. Referenz auf die Zutat
4. Zusatzhinweise/Angabe in Textform

Eine Mengeneinheit
1. einer Bezeichnung
2. einer Abkürzung

Eine Zutat könnte bestehen aus
1. einem Namen im Singular
2. optional Name im Plural

Das ließe sich dann entsprechend erweitern, z. B. Rezepte um Tags oder Kategorien, Zutaten um Nährwertangaben oder Allergene, natürlich lassen sich so die Zutaten auch klassifizieren (regional, exotisch, ayurwedisch, vegan, was weiß ich)
 

Zurück
Oben