Objekt aus einer anderen Klasse erstellen lassen (Java)?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Hallo timminator253,

ein Kiosk ist doch schon mal eine schöne Aufgabe. Auch im "echten Leben" findet man unzählige Shops mit Produkten diverser Art, die angeboten werden.

Dein Code zeigt allerdings ein paar Schwachstellen, die wir zunächst mal beseitigen sollten.

1) Deine Klassen enthalten nur statische Variablen. Chips zum Beispiel hat "static String vName". Du solltest das "static" entfernen, da dies eine Klassenvariable ist und für jede Instanz auf diese zugreift. Die Klassenvariable ist quasi global und hat nichts mit den instanzierten Objekten zutun.

2) Auch deine Methoden sind alle statisch - eine logische Folge von 1). Damit schreibst Du dann aber auch Chips.getPreis() was nicht auf ein Objekt zugreift, sondern wieder nur auf die globale Klassenvariable. Auch bei den Methoden solltest Du auf static verzichten (außer bei deiner main-Methode).

3) Deine "Attribute", aktuell noch static, sollten private sein. Chips zum Beispiel könnte folgendes Attribut enthalten:

private String name;

Mit private stellst Du sicher, dass die Attribute nicht von außen zugegriffen, oder verändert werden ohne entsprechende getter/setter zu benutzen.

4) "double" ist denkbar schlecht um Geldbeträge zu speichern. "double" und "float" sind floating-point-numbers (Gleitpunktzahlen) und sind für Geldberechnungen im Regelfall zu ungenau. Du kannst sie womöglich bei diesem einfachen Beispiel benutzen, produktiv ist das allerdings ein no-go. Wenn es um echtes Geld geht nutzt man geeignetere Datentypen - unter Umständen nutzt man einfach long und speichert die Beträge in Euro-Cent.

5) Du versuchst in Chips mehrere Konstruktoren (Pringles(), Chio()) umzusetzen, das geht leider nicht. Wie wäre es mit einem Konstruktor:

public Chips(String name, long preis)

Die Klasse selbst muss gar nicht wissen welche konkreten Chips es gibt.

Dein Kiosk kann dann Chips-Sorten mit "new" anlegen:

Chips chioChips = new Chips("Chio", 150L);

Außerdem kannst Du so dynamisch zur Laufzeit neue Chipssorten anlegen. So könnte zum Beispiel der Nutzer Name und Preis für Chipssorten eingeben.

Ich hoffe das hilft erstmal für den Anfang. Auf jeden Fall musst Du von "static" los kommen, da Du sonst immer nur einen Kontostand hast, einen globalen Kundennamen, einen Chipspreis und einen Chipsnamen.

Gruß

Woher ich das weiß:Berufserfahrung

timminator253 
Fragesteller
 01.10.2018, 21:46

Vielen dank für deine Hilfe! Ich werde es morgen umsetzen und dann einen neuen Bericht schreiben. Vielen Dank und schönen Abend noch!

0
AldoradoXYZ  01.10.2018, 21:49
@timminator253

Ja, viel Spaß dabei.

Ansonsten könntest Du dir noch überlegen, dass Du vielleicht mehr als nur Chips anbieten können willst. Wie wäre es also, wenn man die Klasse Chips in Product umbenennt?

Ein Produkt hat einen eindeutigen Namen und einen Preis, da würde eine Product-Klasse gut passen.

Gruß

0
timminator253 
Fragesteller
 03.10.2018, 17:06
@AldoradoXYZ

Hallo,

Ich habe nun das meiste umgesetzt, jedoch verbleibt ein Problem, was mich Ratlos macht:

Wenn ich in der Klasse Kiosk, also der Hauptklasse, eingebe:

Chips chioChips = new Chips("Chio", 1.50);

Dann wird schön ein neues Objekt erstellt. Aber wenn ich das mit void mache, passiert garnichts also:

public void Chips_Auswahl()

  {

    Chips chioChips = new Chips("Chio", 1.50);

  }

Weshalb nicht? Ich möchte ja eingeben können, welches Objekt erstellt werden soll.

Gruß Tim.

0
AldoradoXYZ  04.10.2018, 20:02
@timminator253

Ok, so wie Du das machst wird dein Objekt chioChips vom Typ Chips natürlich erstellt, aber danach wird mit dem Objekt nichts mehr gemacht.

Du möchtest wahrscheinlich, dass die Methode das Objekt zurückgibt. Dazu kannst Du return benutzen:

public Chips chipsAuswahl()
{
   Chips chioChips = new Chips("Chio", 1.50);
   return chioChips;
}

//oder kürzer einfach

public Chips chipsAuswahl()
{
   return new Chips("Chio", 1.50);
}

Du musst die Chips nicht mal in einer Variable (chioChips) speichern, da Du mit dem Objekt sowieso nichts weiter machst, als eben die Rückgabe.

Ansonsten werden Methoden klein geschrieben und dann CamelCase (also lowerCamelCase) http://www.datenbanken-verstehen.de/namenskonventionen-datenbank/camel-case-notation/

Gruß

0

Ich verstehe in etwa was du meinst. Wahrscheinlich hast du unterbewusst und ohne überhaupt etwas davon zu wissen ein Factory Pattern implementieren wollen.

Kurz: Ein Objekt, das andere Objekte erzeugen kann und auch nur dafür da ist, nennt man Factory.

Deine class Chips würde ich also zur class ChipsFactory umbenennen.
Die Methoden deiner ChipsFactory würde ich übrigens nicht nur Chio und Pringles nennen, sondern createPringles() und createChios().

Den Namen Chips würde ich mir aufheben um ein Interface oder eine Abstract class zu bauen, von denen dann Pringles und Chio erben können. Somit könntest du zB. in deiner Kiosk Klasse auch erreichen, dass du den Preis der Chips anzeigen kannst, egal ob es nun Pringles oder Chios sind.

Du solltest dich jetzt also konkret noch mit Interfaces, Abstrakten Klassen und Vererbung beschäftigen. Ansonsten wirst du einige Schwierigkeiten bei der Umsetzung haben.

Der Kunde hat übrigens in der Factory gar nix zu suchen. Es ist die Aufgabe des Kiosk dem Kunden Geld abzuknöpfen und sich um die Preise zu kümmern.

Woher ich das weiß:Berufserfahrung – Berufserfahrung

TheQ86  01.10.2018, 17:51

Du brauchst auf jeden Fall mehr Klassen. Pringles und Chios müssen jeweils eigene Klassen haben. Deine Art und Weise dein Chips Objekt "von innen heraus" durch die Methoden anzupassen funktioniert in deinem Mini Szenario noch, ist aber später kaum noch ordentlich zu warten.

0
AldoradoXYZ  01.10.2018, 18:10
@TheQ86
Du brauchst auf jeden Fall mehr Klassen. Pringles und Chios müssen jeweils eigene Klassen haben.

Genau und will man weitere Chips-Sorten hinzufügen, dann muss man natürlich weitere Klassen anlegen. Will man neue Produkte hinzufügen, man muss selbstverständlich neue Klassen anlegen. Man merkt hoffentlich bei diesem winzigen Beispiel-Kiosk schon, wie unsinnig das ist. Aber selbst professionelle Entwickler machen diesen Fehler; zum Glück sieht man es nicht oft und dann auch nicht so offensichtlich.

0
AldoradoXYZ  01.10.2018, 18:15

Der Fragesteller demonstriert auf vielfache Weise (Code und auch Text), dass er von der Materie der objektorientierten Programmierung und Entwicklung allgemein wenig bis gar keine Ahnung hat.

Ich halte es für grob fahrlässig ihm nun mit Patterns zu kommen. Auch Interfaces und abstrakte Klassen werden einen Anfänger mehr vom Ziel abbringen als ihm zu helfen.

Ob Anfänger, oder schon etwas weiter das https://de.wikipedia.org/wiki/KISS-Prinzip sollte beherzigt werden. Bei komplexen Problemen kann das schwierig sein. Bei diesem Kiosk tut man aber sicher gut daran es möglichst einfach zu halten.

Gruß

0
TheQ86  01.10.2018, 18:21
@AldoradoXYZ

Sorry, es ist Java. OOP durch und durch. Es wäre eher fahrlässig vom Lehrer so eine Aufgabe zu stellen ohne vorher die objektorientierten Kenntnisse vermittelt zu haben.

Es sei denn er will absichtlich, dass die Schüler solche Fehler machen um anhanddessen die Notwendigkeit von OOP zu vermitteln. Wäre aber mMn. so auch der falsche Ansatz.

Ja, Patterns zu vermitteln ist zu diesem Zeitpunkt noch weit vorgegriffen, die Factory ist aber durchaus nicht das Schwerste und ein Ausblick über den Tellerrand kann man ja trotzdem mal anschneiden.

0
AldoradoXYZ  01.10.2018, 18:34
@TheQ86

Dass Du für verschiedene Chips-Sorten verschiedene Klassen nutzen möchtest zeigt allerdings auch, dass da ebenfalls Verständnis fehlt.

Es wäre fast so als würde man für jedes Literal eine eigene Klasse definieren, statt die etwas abstraktere (im logischen Sinne) Version zu nutzen, die java.lang bietet: String.

Ich möchte bestimmt niemandem vorschreiben, wann er Patterns zu benutzen hat, aber dem Fragesteller wäre schon sehr geholfen wenn er verstehen würde was der Unterschied zwischen Klasse und Objekt ist und wie er überhaupt Objekte erzeugt.

Gruß

0