Java - Arrays, Getter und Setter?


16.12.2021, 06:39

Zu den Klassen: ich habe eine Klasse, in der die Pizza-Attribute stehen mit den jeweiligen Gettern und Settern, in der Main wird dann der Rest bearbeitet


16.12.2021, 06:55

Was ich vergessen habe zu erwähnen, zwei verschiedene Durchmesser usw. war nur ein Beispiel, es sollen beliebig viele möglich sein!

3 Antworten

Ich würde einfach eine generelle Pizza Klasse machen, und dann subklassen für die unterschiedlichen arten Pizza und dann Entweder einen Parameter für die Größe und Preis, oder aber nochmal subklassen für die Größen.

Ich würde es so machen, dass alle möglichen Beläge in einer Liste oder evtl. auch in einer Hashmap stehen und du pro Pizza dann nochmal eine Hashmap mit den Größen und Preisen erstellst.

Etwa so:

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class Pizza {
	private final String topping;
	private final Map<Integer, Double> diameterPrice = new HashMap<>();
	
	public static void main(String[] args) {
		Map<String, Pizza> allPizzas = new HashMap<>();
		
		Pizza margherita = new Pizza("Margherita");
		margherita.addDiameterPrice(26, 4.0);
		margherita.addDiameterPrice(30, 6.0);
		allPizzas.put("Margherita", margherita);
		
		Pizza salami = new Pizza("Salami");
		salami.addDiameterPrice(30, 5.0);
		salami.addDiameterPrice(32, 7.0);
		allPizzas.put("Salami", salami);
		
		// Kleines Beispiel, was man mit den Pizza-Objekten anfangen kann:
		for (Entry<String, Pizza> entry:allPizzas.entrySet()) {
			System.out.println("Pizza Sorte: " + entry.getValue().topping);
			entry.getValue().getDiametersAndPrices().forEach((diameter, price)->{
				double squareCm = Math.pow(diameter/2.0, 2)*Math.PI;
				double pricePerSquareCm = price/squareCm;
				System.out.printf("\tDurchmesser %dcm: Preis pro cm²: %.2f cent%n", diameter, pricePerSquareCm*100);
			});
			System.out.println();
		}
	}
	
	public Pizza(String topping) {
		this.topping = topping;
	}
	
	public String getTopping() {
		return topping;
	}
	
	public void addDiameterPrice(int diameter, double price) {
		this.diameterPrice.put(diameter, price);
	}
	
	public Set<Integer> getDiameters() {
		return diameterPrice.keySet();
	}
	
	public Map<Integer, Double> getDiametersAndPrices() {
		return new HashMap<>(diameterPrice);
	}
	
	public double getPrice(int diameter) {
		return diameterPrice.get(diameter);
	}
}

Arrays sind in den wenigsten Fällen empfehlenswert und darüber, einzelne Eigenschaften von mehreren Objekten in einem Array abzulegen, solltest du gar nicht erst nachdenken.

Du musst eine Klasse für Pizzen machen, welche Durchmesser und Preis als Attribute hat. Getter/Setter halte ich hier für unnötig, könntest du aber theoretisch auch machen.

Dann machst du einen Array mit Objekten der Pizza-Klasse und alles ist wundervoll.

TechPech1984  16.12.2021, 06:44
Getter/Setter halte ich hier für unnötig

da hat einer noch nicht wirklich begriffen warum es OOP gibt . oh man , jetzt weiss ich warum die meiste software so buggi ist , weil sie alle zu faul sind und einfach die dinge nicht beachten wollen die im paradigma festgelegt worden sind . einfach mal strict denken und nicht irgendeinen faulheits quatsch machen . solche mitarbeiter mag ich ganz besondern , "ja geht doch auch so" und ich darf monate später dann die folge probleme lösen , weil der faule mitarbeiter ständig abkürzungen nimmt . wofür gibts kapselung , dann kann man OOP doch gleich ganz lassen . warum überhaupt private variablen , wird schon nichts passieren . *kopf auf tisch*

1
J0T4T4  16.12.2021, 06:56
@TechPech1984

Da es sich hier eher um ein struct, also eine Gruppierung von Attributen handelt, kann man sich gerne Getter/Setter schenken. Die Klasse hat ja außer den Gettern/Settern sowieso keine Methoden, in denen etwas schief laufen könnte.

Aber wenn es dein Gewissen beruhigt, dann kann man die Attribute auch gerne final machen.

0
vamosalaplaya17 
Fragesteller
 16.12.2021, 06:45

Bei einer festgelegten Anzahl bekomme ich das locker hin, habe allerdings Schwierigkeiten, das für eine beliebige Anzahl an Durchmessern usw. zu lösen. Und mit einer gescheiten Zuweisung klappts irgendwie auch nicht richtig. 🤔

0
vamosalaplaya17 
Fragesteller
 16.12.2021, 06:48
@J0T4T4

Ja klar, allerdings kann eine Sorte verschiedene Durchmesser haben, man kann diese mit 26 cm Durchmesser, 28 cm Durchmesser... usw. bestellen

0
J0T4T4  16.12.2021, 06:57
@vamosalaplaya17

Dann füg einfach ein String-Attribut zur Klasse Pizza hinzu, in dem die Sorte steht.

0
regex9  16.12.2021, 07:07
@vamosalaplaya17

Ein Beispiel mit Hunden:

public enum Race { Bulldog, Eskimo, Shepherd, Terrier, /* ... */ }

public class Dog {
  private String name;
  private Race race;

  /* constructor, getters, setters, ... */
}

// main:
Dog yock = new Dog();
yock.setName("Yock");
yock.setRace(Race.Terrier);

Die Rassetypen werden in einem Enum zusammengefasst. So kann man Rechtschreibfehlern entgehen.

1
J0T4T4  16.12.2021, 14:42
@regex9

Ich wusste nicht, ob und wie enums in Java funktioniert. Mit Enums ist es natürlich nochmal deutlich schöner.

0