Type/Cast Problem

Lybrial

Bekanntes Mitglied
Hallo,

ich bin gerade dabei eine Art Shop zu programmieren auf noch ganz primitivem Niveau.
Ich habe verschiedene Artikel, die einmal in einem Inventory und einem Warenkorb gespeichert sind.
Inventory und Warenkorb schreibe ich je in ein File. Das funktioniert alles wunderbar, nur leider
weiß ich nicht, wie ich die Anzahl der Artikel in meinen Dateien ändern kann, da ich nicht weiß
an welcher Stelle ich dafür Casten muss. Hier mal zu dem für das Problem wesentlichem Code:

Mein Inventory das in die Storage geschrieben wird:
Java:
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.File;
import java.io.IOException;
import java.io.FileNotFoundException;

public class Storage implements java.io.Serializable{
	private static final long serialVersionUID = 23421;
	private static Storage mStorage = null;
	private static Inventory inv = new Inventory();
	private static ArrayList<String> mArrayListName = new ArrayList<String>(inv.getInventoryNames());
	private static ArrayList<Integer> mArrayListPrice = new ArrayList<Integer>(inv.getInventoryPrice());
	private static ArrayList<Integer> mArrayListAmount = new ArrayList<Integer>(inv.getInventoryAmount());
	//*****Konstruktor***********************
	public Storage(){}
	//*********************************************************************
	public static Storage instanciate(){				//Singleton
		if(mStorage == null){
			if(!Storage.readFile()){
				mStorage = new Storage();
			}
    	} 
    	return mStorage;
	}
	//*********************************************************************
	public static void writeFile(){
		try{
			ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("Storage.txt"), false));
			out.writeObject(getArrayListName());
			out.writeObject(getArrayListPrice());
			out.writeObject(getArrayListAmount());
			out.flush();
			out.close();
		}catch(FileNotFoundException e1){
			System.out.println(e1);
		}catch(IOException e2) {
			System.out.println(e2);
		}
	}
	//*********************************************************************
	public static boolean readFile(){
		try{
			ObjectInputStream in = new ObjectInputStream(new FileInputStream("Storage.txt"));
			setArrayListName((ArrayList<String>)in.readObject());  
			setArrayListPrice((ArrayList<Integer>)in.readObject());
			setArrayListAmount((ArrayList<Integer>)in.readObject());
			in.close();
			return true;
		}catch(FileNotFoundException e1){
			System.out.println(e1);
		}catch(IOException e2) {
			System.out.println(e2);
		}catch(ClassNotFoundException e3){
			System.out.println(e3);
		}
		return false;
	}
	//*********************************************************************
	public static ArrayList<String> getArrayListName(){
		return mArrayListName;
	}
	public static void setArrayListName(ArrayList<String> aArrayListName){
		Storage.mArrayListName = aArrayListName;
	}
	public static ArrayList<Integer> getArrayListPrice(){
		return mArrayListPrice;
	}
	public static void setArrayListPrice(ArrayList<Integer> aArrayListPrice){
		Storage.mArrayListPrice = aArrayListPrice;
	}
	public static ArrayList<Integer> getArrayListAmount(){
		return mArrayListAmount;
	}
	public static void setArrayListAmount(ArrayList<Integer> aArrayListAmount){
		Storage.mArrayListAmount = aArrayListAmount;
	}
}

Und hier die Klasse in der Ich die Anzahl ändern möchte:
Java:
public class Worker{
	private Storage mStorage;
	private Account mAccount;
	NumbReader nr = new NumbReader();
	UI ui = new UI();
	Inventory inv = new Inventory();
	Warenkorb war = new Warenkorb();
	private int mChooseMenu;
	private int mChooseEinkauf;
	private int mChooseWarenkorb;
	private int mHowMuch;
	//*****Konstruktor***********************
	public Worker(){
		setStorage(Storage.instanciate());
		setAccount(Account.instanciate());
	}
	//*********************************************************************
	public void doWork(){
		ui.startMenu();
		switch(chooseMenu()){
			case 0:{
				getStorage().writeFile();
				uiEinkaufen();
				switch(chooseEinkauf()){
					case 0:{
						ui.howMuch();
						howMuch();
						einkaufen(0, getHowMuch());
						break;
					}
					case 1:{
						ui.howMuch();
						howMuch();
						einkaufen(1, getHowMuch());
						break;
					}
					case 2:{
						ui.howMuch();
						howMuch();
						einkaufen(2, getHowMuch());
						break;
					}
					case 3:{
						ui.howMuch();
						howMuch();
						einkaufen(3, getHowMuch());
						break;
					}
					case 4:{
						ui.howMuch();
						howMuch();
						einkaufen(4, getHowMuch());
						break;
					}
					case 5:{
						ui.howMuch();
						howMuch();
						einkaufen(5, getHowMuch());
						break;
					}
					case 6:{
						ui.howMuch();
						howMuch();
						einkaufen(6, getHowMuch());
						break;
					}
				}
			}break;
			case 1:{
				getAccount().writeFile();
				ui.warenkorb();
				switch(chooseWarenkorb()){
					case 0:{
						getAccount().readFile();
						ui.warenkorbAnsehen();
						uiWarenkorbAnsehen();
					}break;
					case 1:{
						
					}break;
				}
			}break;
			case 2:{
				System.out.println("Aufwiedersehen!");
				System.exit(0);
			}break;
		}
	}
	//*********************************************************************
	public int chooseMenu(){
		setChooseMenu(nr.getIntValue());
		return getChooseMenu();
	}
	//*********************************************************************
	public int chooseEinkauf(){
		setChooseEinkauf(nr.getIntValue());
		return getChooseEinkauf();
	}
	//*********************************************************************
	public int chooseWarenkorb(){
		setChooseWarenkorb(nr.getIntValue());
		return getChooseWarenkorb();
	}
	//*********************************************************************
	public int howMuch(){
		setHowMuch(nr.getIntValue());
		return getHowMuch();
	}
	//*********************************************************************
	public void uiEinkaufen(){
		getStorage().readFile();
		ui.einkaufen();
		for(int i = 0; i < getStorage().getArrayListName().getArray().length; i++){
			System.out.print("("+i+")"+getStorage().getArrayListName().getArray()[i]);
			System.out.print('\t');
			System.out.print(getStorage().getArrayListPrice().getArray()[i]);
			System.out.print('\t');
			System.out.println(getStorage().getArrayListAmount().getArray()[i]);
		}
		ui.einkaufen2();
	}
	//*********************************************************************
	public void uiWarenkorbAnsehen(){
		for(int i = 0; i < getAccount().getArrayListName().getArray().length; i++){
			System.out.print("("+i+")"+getAccount().getArrayListName().getArray()[i]);
			System.out.print('\t');
			System.out.print(getAccount().getArrayListPrice().getArray()[i]);
			System.out.print('\t');
			System.out.println(getAccount().getArrayListAmount().getArray()[i]);
		}
	}
	//*********************************************************************
	public void einkaufen(int aNumber, int aAmount){
		switch(aNumber){
			case 0:{
				inv.setCp0Amount(inv.getCp0Amount()-aAmount);
				war.setCp0Amount(war.getCp0Amount()+aAmount);
			}break;
			case 1:{
				inv.setCp1Amount(inv.getCp1Amount()-aAmount);
				war.setCp1Amount(war.getCp1Amount()+aAmount);
			}break;
			case 2:{
				inv.setCp2Amount(inv.getCp2Amount()-aAmount);
				war.setCp2Amount(war.getCp2Amount()+aAmount);
			}break;
			case 3:{
				inv.setCp3Amount(inv.getCp3Amount()-aAmount);
				war.setCp3Amount(war.getCp3Amount()+aAmount);
			}break;
			case 4:{
				inv.setMpAmount(inv.getMpAmount()-aAmount);
				war.setMpAmount(war.getMpAmount()+aAmount);
			}break;
			case 5:{
				inv.setOmpAmount(inv.getOmpAmount()-aAmount);
				war.setOmpAmount(inv.getOmpAmount()+aAmount);
			}break;
			case 6:{
				inv.setSmpAmount(inv.getSmpAmount()-aAmount);
				war.setSmpAmount(inv.getSmpAmount()+aAmount);
			}break;
		}
	}
	//*********************************************************************
	public Storage getStorage(){
		return mStorage;
	}
	private void setStorage(Storage aStorage){
		this.mStorage = aStorage;
	}
	public Account getAccount(){
		return mAccount;
	}
	private void setAccount(Account aAccount){
		this.mAccount = aAccount;
	}
	public int getChooseMenu(){
		return mChooseMenu;
	}
	private void setChooseMenu(int aChooseMenu){
		this.mChooseMenu = aChooseMenu;
	}
	public int getChooseEinkauf(){
		return mChooseEinkauf;
	}
	private void setChooseEinkauf(int aChooseEinkauf){
		this.mChooseEinkauf = aChooseEinkauf;
	}
	public int getChooseWarenkorb(){
		return mChooseWarenkorb;
	}
	private void setChooseWarenkorb(int aChooseWarenkorb){
		this.mChooseWarenkorb = aChooseWarenkorb;
	}
	public int getHowMuch(){
		return mHowMuch;
	}
	private void setHowMuch(int aHowMuch){
		this.mHowMuch = aHowMuch;
	}
}

So jetzt müsste ich ja in der Methode einkaufen(int, int) nachdem ich die Anzahl der jeweiligen Artikel
in deren Klassen geändert habe, sie auch noch in der Klasse Storage neu setzen, damit die neue Anzahl auch in die Datei geschrieben wird. Aber ich stehe derzeit total auf dem Schlauch wie das funktionieren soll.

Ich dachte eigentlich es wäre logisch, dass ich einfach nochmal meine Arrays neu in die Datei schreibe,
nur das hat leider die Stückzahl nicht verändert.
Java:
public void einkaufen(int aNumber, int aAmount){
		switch(aNumber){
			case 0:{
				inv.setCp0Amount(inv.getCp0Amount()-aAmount);
				getStorage().writeFile();
				war.setCp0Amount(war.getCp0Amount()+aAmount);
				getAccount().writeFile();
			}break;
			case 1:{
				inv.setCp1Amount(inv.getCp1Amount()-aAmount);
				getStorage().writeFile();
				war.setCp1Amount(war.getCp1Amount()+aAmount);
				getAccount().writeFile();
			}break;
			case 2:{
				inv.setCp2Amount(inv.getCp2Amount()-aAmount);
				getStorage().writeFile();
				war.setCp2Amount(war.getCp2Amount()+aAmount);
				getAccount().writeFile();
			}break;
			case 3:{
				inv.setCp3Amount(inv.getCp3Amount()-aAmount);
				getStorage().writeFile();
				war.setCp3Amount(war.getCp3Amount()+aAmount);
				getAccount().writeFile();
			}break;
			case 4:{
				inv.setMpAmount(inv.getMpAmount()-aAmount);
				getStorage().writeFile();
				war.setMpAmount(war.getMpAmount()+aAmount);
				getAccount().writeFile();
			}break;
			case 5:{
				inv.setOmpAmount(inv.getOmpAmount()-aAmount);
				getStorage().writeFile();
				war.setOmpAmount(inv.getOmpAmount()+aAmount);
				getAccount().writeFile();
			}break;
			case 6:{
				inv.setSmpAmount(inv.getSmpAmount()-aAmount);
				getStorage().writeFile();
				war.setSmpAmount(inv.getSmpAmount()+aAmount);
				getAccount().writeFile();
			}break;
		}
	}
 
Zuletzt bearbeitet:
(Wenn ich es richtig verstanden habe.)

Ich denke, du solltest für Objekte im Warenkorb eine eigene Klasse erzeugen, die das Objekt, und deren Anzahl speichert. Oder du rennst einfach eine for durch und addest das Objekt n mal zur Liste. Das wäre wohl die einfachste Lösung.

btw. instanciate gehört umbedingt syncronisiert. Du könntest die Instanz auch im static constructor erzeugen, senkt vermutlich auch die Zugriffszeiten.
Und du hast nur statische Variablen und Methoden, wozu eine Instanz anlegen? Per Instanz greift man sowieso auf keine statische Methode zu, ist eigendlich quatsch und solltest auch gewarnt werden.
 
Von Synchronisation und Zugriffszeiten hab ich NOCH keine Ahnung 😉
Die Methoden und Variablen in der Klasse Storage und Warenkorb sind nur deshalb
Static wegen dem Singleton-Pattern, anders hat das iwie nicht funktioniert aber ja
gewarnt werde ich das ist korrekt.

Mit meine Artikeln sieht das derzeit so aus.
Ich habe vier verschiedene Artikel. Deren Name, Preis und Stückzahl speichere ich hier
erst einmal in Arrays ab:
Java:
public class Inventory{
	private int cp0Amount;
	private int cp1Amount;
	private int cp2Amount;
	private int cp3Amount;
	private int mpAmount;
	private int ompAmount;
	private int smpAmount;
	//*****Konstruktor***********************
	public Inventory(){}
	//*********************************************************************
	public String[] getInventoryNames(){
		String[] vInventoryNames = {
				new CoffeePurchase(0).getName(),
				new CoffeePurchase(1).getName(),
				new CoffeePurchase(2).getName(),
				new CoffeePurchase(3).getName(),
				new MilkPurchase().getName(),
				new OrganicMilkPurchase().getName(),
				new SpecialMilkPurchase().getName()
		};
		return vInventoryNames;
	}
	//*********************************************************************
	public Integer[] getInventoryPrice(){
		Integer[] vInventoryPrice = {
				new CoffeePurchase(0).getPrice(),
				new CoffeePurchase(1).getPrice(),
				new CoffeePurchase(2).getPrice(),
				new CoffeePurchase(3).getPrice(),
				new MilkPurchase().getPrice(),
				new OrganicMilkPurchase().getPrice(),
				new SpecialMilkPurchase().getPrice()
		};
		return vInventoryPrice;
	}
	//*********************************************************************
	public Integer[] getInventoryAmount(){
		Integer[] vInventoryAmount = {
				getCp0Amount(),
				getCp1Amount(),
				getCp2Amount(),
				getCp3Amount(),
				getMpAmount(),
				getOmpAmount(),
				getSmpAmount()
		};
		return vInventoryAmount;
	}
	//*********************************************************************
	public int getCp0Amount(){
		return cp0Amount;
	}
	public void setCp0Amount(int cp0Amount){
		this.cp0Amount = cp0Amount;
	}
	public int getCp1Amount(){
		return cp1Amount;
	}
	public void setCp1Amount(int cp1Amount){
		this.cp1Amount = cp1Amount;
	}
	public int getCp2Amount(){
		return cp2Amount;
	}
	public void setCp2Amount(int cp2Amount){
		this.cp2Amount = cp2Amount;
	}
	public int getCp3Amount(){
		return cp3Amount;
	}
	public void setCp3Amount(int cp3Amount){
		this.cp3Amount = cp3Amount;
	}
	public int getMpAmount(){
		return mpAmount;
	}
	public void setMpAmount(int mpAmount){
		this.mpAmount = mpAmount;
	}
	public int getOmpAmount(){
		return ompAmount;
	}
	public void setOmpAmount(int ompAmount){
		this.ompAmount = ompAmount;
	}
	public int getSmpAmount(){
		return smpAmount;
	}
	public void setSmpAmount(int smpAmount){
		this.smpAmount = smpAmount;
	}
}
Die speichere ich dann wie schon erwähnt in eine Datei:
Java:
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.File;
import java.io.IOException;
import java.io.FileNotFoundException;

public class Storage implements java.io.Serializable{
	private static final long serialVersionUID = 23421;
	private static Storage mStorage = null;
	private static Inventory inv = new Inventory();
	private static ArrayList<String> mArrayListName = new ArrayList<String>(inv.getInventoryNames());
	private static ArrayList<Integer> mArrayListPrice = new ArrayList<Integer>(inv.getInventoryPrice());
	private static ArrayList<Integer> mArrayListAmount = new ArrayList<Integer>(inv.getInventoryAmount());
	//*****Konstruktor***********************
	public Storage(){}
	//*********************************************************************
	public static Storage instanciate(){				//Singleton
		if(mStorage == null){
			if(!Storage.readFile()){
				mStorage = new Storage();
			}
    	} 
    	return mStorage;
	}
	//*********************************************************************
	public static void writeFile(){
		try{
			ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("Storage.txt"), false));
			out.writeObject(getArrayListName());
			out.writeObject(getArrayListPrice());
			out.writeObject(getArrayListAmount());
			out.flush();
			out.close();
		}catch(FileNotFoundException e1){
			System.out.println(e1);
		}catch(IOException e2) {
			System.out.println(e2);
		}
	}
	//*********************************************************************
	public static boolean readFile(){
		try{
			ObjectInputStream in = new ObjectInputStream(new FileInputStream("Storage.txt"));
			setArrayListName((ArrayList<String>)in.readObject());
			setArrayListPrice((ArrayList<Integer>)in.readObject());
			setArrayListAmount((ArrayList<Integer>)in.readObject());
			in.close();
			return true;
		}catch(FileNotFoundException e1){
			System.out.println(e1);
		}catch(IOException e2) {
			System.out.println(e2);
		}catch(ClassNotFoundException e3){
			System.out.println(e3);
		}
		return false;
	}
	//*********************************************************************
	public static ArrayList<String> getArrayListName(){
		return mArrayListName;
	}
	public static void setArrayListName(ArrayList<String> aArrayListName){
		Storage.mArrayListName = aArrayListName;
	}
	public static ArrayList<Integer> getArrayListPrice(){
		return mArrayListPrice;
	}
	public static void setArrayListPrice(ArrayList<Integer> aArrayListPrice){
		Storage.mArrayListPrice = aArrayListPrice;
	}
	public static ArrayList<Integer> getArrayListAmount(){
		return mArrayListAmount;
	}
	public static void setArrayListAmount(ArrayList<Integer> aArrayListAmount){
		Storage.mArrayListAmount = aArrayListAmount;
	}
}
Und meine Worker-Klasse die ich oben gepostet habe verändert bei Einkäufen die Anzahl
Direkt in der Inventory-Klasse.
 
Warum machst dus nicht so, wie ich vorgeschlagen habe?
Einmal ein Item, was es zu kaufen gibt, in dem speicherst du Namen, Preis, Typ etc.
Und dann noch eins, in dem speicherst du das Item, Anzahl, und vielleicht dem Preis nocheinmal, falls er sich wärend der Bestellabarbeitung ändern sollte.
Du hast ziemlich viele Collections, die parallel Daten abspeichern. Durch OOP wird sowas aber unnötig.

Edit: Ups, recht langsam. 😳
Ich denke, das würde aber dein Problem lösen. Storage (ich denke das ist der Warenkorb) hätte dann eine Liste mit allen Items, die ausgewählt wurden. Ändert sich die Anzahl in einen Objekt, wird auch der Inhalt mit veränderten Variablen serialisiert.
 
Zuletzt bearbeitet:
Hab es jetzt mal ohne Singleton und somit auch ohne Static-Methoden gemacht.
Hab jetzt einen wunderschönen fehlerfreien und warnungsfreien Code, der trotzdem
nicht das tut was ich möchte 😀

Er schreibt mir die Veränderungen einfach nicht in die Datei rein obwohl ich
mitlerweile nach jeder pups-kleinen Verändunger writeFile() und readFile() ausführe.

Hab mal das ganze Package hochgeladen:
Download: Shop.rar | xup.in

Wie schon erwähnt ihr werdet dort haufenweise writeFile() und readFile() finden, hab das
einfach so mal reingespammt weil ich einfach keinen Plan mehr habe warum das nicht
aktualisiert wird. Wird so wie es ist sicher nicht viel Sinn machen. Kann ja sein das ich
einfach mal ne Nacht drüber schlafen muss 😉
 

Neue Themen


Zurück
Oben