Eigene Factory Klasse

moessi91

Bekanntes Mitglied
Hey ich habe hier das Problem dass ich mir mit einer Factory klasse immer neue Objecte liefere und diese dann in ein array adde, dabei hat sich aber das problem aufgetan dass irgendwie auch die daten im array geändert werden. hoffe um rat. Wenn ich es normal erzeuge gehts.
Hier mal die Methode wo ich das Array fülle:
Java:
verbindung = getConnection(info);
		
		Statement sqlAnw = verbindung.createStatement();
		ArrayList<Supplier> array = new ArrayList<Supplier>();
		ResultSet rs = sqlAnw.executeQuery("SELECT suppliers.*, places.ort " +
				"FROM suppliers, places " +
				"WHERE places.plz = suppliers.plz " +
				"ORDER BY suppliers.name ASC");
		
		Supplier lieferant;
		System.out.println("getAllSuppliers--------------------------------------------");
while(rs.next())
		{
			
//			lieferant = new Supplier();
			lieferant = ClassFactory.getSupplier();
			System.out.println("Nach ClassFactory: "+lieferant.toString());
			
			lieferant.setName(rs.getString("name"));
			lieferant.setId(rs.getString("idlieferant"));
			lieferant.setPlz(rs.getInt("plz"));
			lieferant.setWohnort(rs.getString("ort"));
			lieferant.setAdresse(rs.getString("adresse"));
			lieferant.setHausnummer(rs.getString("hausnummer"));
			
			System.out.println("Nach Befüllen: "+lieferant.toString());
			
			array.add(lieferant);
			
			for(int i = 0; i < array.size(); i++)
				System.out.println("Nach dem hinzufügen zum array: "+array.get(i).toString());
		}
Hier noch die Factory methode
Java:
/*Returns a Supplier or Creates a new One if doesent alreadyd Exist*/
	public static Supplier getSupplier()
	{
//Bis zum Ende des Arrays nach der OID suchen und dann zurückgegeben wenn es nicht gefunden wird, ein neues erzeugen zurückgeben und dem Array 
//hinzufügen
		for(int i=0; i < ObjectArray.size();i++)
			if(ObjectArray.get(i).OID==OIDS.SULPPLIER)
				return (Supplier) ObjectArray.get(i);

		return (Supplier) createSupplier();
	}
dazu noch die createSupplier() methode:
Java:
public static Supplier createSupplier()
	{
		Supplier s = new Supplier();
		ObjectArray.add(s);
		return s;
	}
Hier noch das Object array und die klassen:
Java:
//Array: 
static ArrayList<StateOIDs> ObjectArray = new ArrayList<StateOIDs>();
//Supplier Klasse:
public class Supplier extends StateOIDs
{
	String id;
	String name;
	String adresse;
	String wohnort;
	String hausnummer;
	int plz;
	
	public Supplier()
	{
		OID = OIDS.SULPPLIER;
		state = Conditions.ILLEGAL;
	}
	
	public Supplier(String id, String name, String adresse, String hausnummer,
			int plz) 
	{
		super();
		this.id = id;
		this.name = name;
		this.adresse = adresse;
		this.hausnummer = hausnummer;
		this.plz = plz;
	}
//Getter und Setter
.
.
.
.
//State OIDS klasse:
public class StateOIDs 
{
	protected int state;
	protected int OID;
}

Danke schonmal 🙂
 
Zuletzt bearbeitet:
Was ist "array" genau für ein Typ?

Hm, jedes mal wenn du etwas hinzufügst ändert sich der array, aber das hast du sicher nicht gemeint... was heisst "dass irgendwie auch die daten im array geändert werden."?

Wer ändert Daten? Warum ist das ein Problem?
 
Habe jetzt einfach die ganze klasse rein gespeichert und hier noch die ausgabe von dem ganzen:
Rot markiert wo das ist was ich nicht verstehe.

Mit der Factory erzeugt:
getAllSuppliers--------------------------------------------
Nach ClassFactory: Supplier
[adresse=Jägerweg, hausnummer=13, id=3430Brauerei, name=Brauerei, plz=4702, wohnort=Wallern]
Nach Befüllen: Supplier
[adresse=ABC straße, hausnummer=1, id=3592Baushaus, name=Baushaus, plz=4600, wohnort=Wels]

Hier steht noch das richtige drinnen:
Nach dem hinzufügen zum array: Supplier
[adresse=ABC straße, hausnummer=1, id=3592Baushaus, name=Baushaus, plz=4600, wohnort=Wels]

Nach ClassFactory: Supplier
[adresse=ABC straße, hausnummer=1, id=3592Baushaus, name=Baushaus, plz=4600, wohnort=Wels]
Nach Befüllen: Supplier
[adresse=Jägerweg, hausnummer=13, id=3430Brauerei, name=Brauerei, plz=4702, wohnort=Wallern]

Hier ist jetzt auf einmal alles von der Brauerei also dem 2. element obwohl ich vorher noch das alte hinzugefügt habe.
Nach dem hinzufügen zum array: Supplier
[adresse=Jägerweg, hausnummer=13, id=3430Brauerei, name=Brauerei, plz=4702, wohnort=Wallern]
Nach dem hinzufügen zum array: Supplier
[adresse=Jägerweg, hausnummer=13, id=3430Brauerei, name=Brauerei, plz=4702, wohnort=Wallern]

Supplier
[adresse=Jägerweg, hausnummer=13, id=3430Brauerei, name=Brauerei, plz=4702, wohnort=Wallern]
Supplier
[adresse=Jägerweg, hausnummer=13, id=3430Brauerei, name=Brauerei, plz=4702, wohnort=Wallern]
END: getAllSuppliers----------------------------------------

Normal erzeugt geht alles:
getAllSuppliers--------------------------------------------
Nach ClassFactory: Supplier
[adresse=null, hausnummer=null, id=null, name=null, plz=0, wohnort=null]
Nach Befüllen: Supplier
[adresse=ABC straße, hausnummer=1, id=3592Baushaus, name=Baushaus, plz=4600, wohnort=Wels]
Nach dem hinzufügen zum array: Supplier
[adresse=ABC straße, hausnummer=1, id=3592Baushaus, name=Baushaus, plz=4600, wohnort=Wels]
Nach ClassFactory: Supplier
[adresse=null, hausnummer=null, id=null, name=null, plz=0, wohnort=null]
Nach Befüllen: Supplier
[adresse=Jägerweg, hausnummer=13, id=3430Brauerei, name=Brauerei, plz=4702, wohnort=Wallern]
Nach dem hinzufügen zum array: Supplier
[adresse=ABC straße, hausnummer=1, id=3592Baushaus, name=Baushaus, plz=4600, wohnort=Wels]
Nach dem hinzufügen zum array: Supplier
[adresse=Jägerweg, hausnummer=13, id=3430Brauerei, name=Brauerei, plz=4702, wohnort=Wallern]
Supplier
[adresse=ABC straße, hausnummer=1, id=3592Baushaus, name=Baushaus, plz=4600, wohnort=Wels]
Supplier
[adresse=Jägerweg, hausnummer=13, id=3430Brauerei, name=Brauerei, plz=4702, wohnort=Wallern]
END: getAllSuppliers----------------------------------------------------------
 
Wer ändert Daten?
Warum ist das überhaupt ein Problem?

Sind immer noch meine Fragen. Der output oben ist für mich zu unübersichtlich

(Kleine Randbemerkung: Variablennamen bitte klein Schreiben -> ObjectArray)
 
Die erste Methode holt daten aus der Datenbank und schreibt diese in das Object Array,
in der Schleife
while(rs.next)
wird von der Factory der Supplier geholt überschrieben und dann dem Array hinzugefügt
Mann sieht in der ausgabe, (rot) dass beim ersten eintragen das richtige drinnen steht und sobald das 2. object hinzugefügt wird wird irgendwie das 1. auch geändert.
 
bezwecken soll das ganze, dass die Daten aus der Datenbank object für object in das array gespeichert werden sollen welches zurückgegeben wird und dann in eine tabelle kommt.
 
Das Folgende ist eine Vermutung:

Wenn dir die Factory immer dieselbe Referenz liefert, wird auf allen Positionen deiner Liste auch dieselbe abgelegt.
Das heisst alle Felder referenzieren ein und dasselbe Objekt.

(was steckt genau hinter lieferant = ClassFactory.getSupplier();?)

Wenn du die Daten darin änderst ist klar was passiert...

Gibt doch mal die Hashcodes aller in der Liste referenzierten Objekte aus - wenn im Objekt drin toString nicht überschrieben ist, einfach mit system.out.println(...) und sonst halt mit system.out.println((Object)...)

Wenn die alle gleich sind ist der Fall klar.
 
Was solle diese ArrayList und diese for-Schleife in getSupplier() ?

Die hashCodes sind übrigens gleich weil es sich bei allen um dasselbe Objekt handelt.
In der getSupplier() gibst Du ja immer dasselbe Objekt zurück, änderst dessen Werte und packst die Referenz darauf in Dein array.
 
Ja wir haben in der Schule den Auftrag bekommen unser Programm so umzuändern, dass nicht immer neue Objekte erzeugt werden mit new Supplier z.B. sondern es sollen Factory Klassen verwendet werden um Resourcen zu schonen.
Da wir aber so einen Wunderbaren Lehrer (Professor soll man solche Lehrer nicht nennen) haben der uns absolut nichts erkährt sondern nur sagt: "Schauts im Internet" hat niemand bei uns eine Ahnung wie wir das Lösen sollen und ich hatte hier den ersten Versuch gestartet aber es hat nicht so geklappt. Darum wollte ich hier fragen wie man das vl lösen könnte.

lg
 
Was will man da an Resourcen schonen? Verschiedene Supplier benötigen nun mal Ihr eigenens Objekt.
Schmeiss die ArrayList raus und schon hast Du ein kleines bisschen Resource geschont ;-)
 
Ja wir haben in der Schule den Auftrag bekommen unser Programm so umzuändern, dass nicht immer neue Objekte erzeugt werden mit new Supplier z.B. sondern es sollen Factory Klassen verwendet werden um Resourcen zu schonen.
Da wir aber so einen Wunderbaren Lehrer (Professor soll man solche Lehrer nicht nennen) haben der uns absolut nichts erkährt sondern nur sagt: "Schauts im Internet" hat niemand bei uns eine Ahnung wie wir das Lösen sollen und ich hatte hier den ersten Versuch gestartet aber es hat nicht so geklappt. Darum wollte ich hier fragen wie man das vl lösen könnte.

lg

Dann sag der lieben Schule sie seien Idio.... :autsch: Aua - äh sie hätten dir etwas nicht ganz richtig vermittelt

Stelle dir vor - alle Referenzen zeigen auf EIN Objekt dessen Inhalt du änderst - was geschieht da wohl?

Objekte mit anderem Inhalt MUSST du mit new erzeugen. Nur wenn an zwei Stellen ein Objekt mit demselben Inhalt liegt wie schon in einem anderen Objekt vorhanden ist, kannst du dieselbe Referenz eintragen.


Hm - ein hinkendes Beispiel 😉
(ja es gibt hunderte bessere Lösungen das zu realisieren - es ist nur ein Beispiel - also bitte nicht "verbessern" 😀 )

Du hast eine liste1 die Objekte enthält - die Liste sei nach der id sortiert
Weil das sortieren extrem lange braucht (Gedankenexperiment! 🙂 ) machst du eine liste2 die nach der plz sortiert sein soll.

Es macht nun keinen Sinn für die liste2 neue Objekte zu generieren. Da können dieselben wie in liste1 verwendet werden.
Da macht es sogar Sinn - wenn nämlich die Strasse oder Hausnummer ändert muss das auch nur in einem Objekt geändert werden.
 
Ja aber der Lehrer will unbedingt dass wir factories verwenden weil er sichs einbildet...

Hm - der Factory müsstest du alle Daten die die Identität des Objektes ausmachen übergegen. Vermutlich reicht im konkreten Fall die id.

Du musst die get-Funktion um einen Parameter (id) erweitern.
In der Factory würde ich persönlich eine HashMap mit der id als key machen.
Die get Methode prüft erst ob es schon ein Objekt mit der ID gibt und gibt dir die Referenz auf dieses.
Wenn es noch keines gibt, wird ein neues generiert, gespeichert und die Referenz darauf zurückgegeben.

Für die ID darf es keine set Methode geben - die darf nur über den Konstruktor gesetzt werden können, sonst kannst du das ganz System ziemlich durcheinander bringen.

Poste doch mal die ganze Factory
 
Java:
if((ObjectArray.get(i).OID==OIDS.SULPPLIER) && 
					((ObjectArray.get(i).getState() == Conditions.ILLEGAL)||(ObjectArray.get(i).getState()==Conditions.ERASED)))

habs jetzt mit dieser wunderbaren if abfrage gelöst... die erzeugt in der Factory neue objecte wenn keine zum überschreiben vorhanden sind.
Danke für die Hilfe und Unterstützung gegen die Lehrkraft ^^ :applaus: :toll:
Leider kann ich ihm nicht sagen dass er ein Idiot ist lohnt sich auch nicht dagegen zu reden was er sagt weil dann kann man sich seinen 5er gleich selber eintragen.
 
Aehm dieser code gehört aber in die Factory!
Die Factory muss das erledigen, sonst ist es eben keine Factory!

und bitte: schreib ObjectArray klein
 

Zurück
Oben