Obj. mit mehreren Attrib. in ArrayList speichern und einz. Attrib. ausgeben

Tiyen

Mitglied
Hallo alle miteinander,

ich hoffe man kann am Titel noch irgendwie erkennen was gemeint ist. Musste mich wegen der Zeichenbegrenzung doch sehr einschränken :rolleyes: Also ich habe folgendes Problem, ich will Objekte mit Attributen wie Namen und Alter in einer ArrayList speichern. Das funktioniert auch, aber wenn ich dann die Liste ausgeben will, wird mir nur die Speicheradresse angezeigt, nicht aber der Inhalt dieser. Weiß einer vielleicht woran das liegt ?

Grüße Tiyen
 

Tiyen

Mitglied
Zumindest mein Informatik Prof. hat gemeint das wäre sowas wie die Speicheradresse. Als Bsp.: Patient@b1ea3fc

Hier einmal die Main:
Java:
import java.util.*;

public class Controller {

	public static void main(String[] args) {

		Arztpraxis praxis = new Arztpraxis("Almenpraxis");

		Patient pat1 = new Patient(0, "Hans Peter");
		Patient pat2 = new Patient(0, "John Doe");
              
                //PID ist ein eindeutiger und global einzigartige ID die jeder Patient bekommt
		PIDGenerator gen = new PIDGenerator();

                //Hier speichere ich den pat1 in der patientenliste der Arztpraxis
		praxis.patErstellen(pat1);
		
                /*
                 *Hier würde ich gerne die Patientenliste ausgeben lassen, dabei
                 *tritt aber der oben genannte Fehler auf
                 */
		System.out.println(praxis.list);
	}
}

Und hier die Klasse Arztpraxis, die die Patientenliste enthält:
Java:
import java.util.*;

public class Arztpraxis {

	public String name;
	public ArrayList<Patient> list;

	// Konstruktor
	public Arztpraxis(String name) {
		this.name = name;
		list = new ArrayList<Patient>();
	}

	// Diese Methode wird in der Main aufgerufen
	public void patErstellen(Patient pat) {
		list.add(pat);
	}
}
 

saftmeister

Nutze den Saft!
Das ist die Objekt-ID innerhalb der Laufzeit - also innerhalb der aktuell laufenden JVM.

Um das Objekt Arztpraxis mittels System.out.println() ausgeben zu können, muss deine Klasse die Methode toString() implementieren. Darin kannst du mittels StringBuffer die einzelnen Attribute in Strings umwandeln. Hier eine Anlaufstelle zum Selbststudium: http://openbook.galileodesign.de/javainsel8/javainsel_10_002.htm#mjf23406b35e57bcc10ac3911a2aa9e639

PS: Dein Prof ist nicht sehr akkurat mit seinen Aussagen. Immer wieder liest man, das Profs so einen Schmarrn erzählen... Heutzutage kann wohl jeder Prof werden... :-(
 

Tiyen

Mitglied
Also vielen Dank erstmal saftmeister. Hat mir echt weitergeholfen. Hätte nur noch eine Frage zu Singleton, ich soll nämlich noch einen IDGenerator schreiben und zwar so, dass zur Laufzeit des Programmes nur ein Generator exisitiert ? Das müsste doch irgendwas mit den Zugriffsrechten gewesen sein oder ?

Hier mal die Klasse IDGenerator
Java:
import java.util.*;

public class PIDGenerator {

	private static int zaehler = 1;

	public PIDGenerator() {
	}

	// Generieren der PID
	protected static String generieren(String pid) {
		pid = "" + zaehler++;
		return pid;
	}
}
 

saftmeister

Nutze den Saft!
Singleton ist ein Design-Pattern. Evtl. mal den Wiki-Artikel lesen: http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)

Grundsätzlich macht sich ein Singleton so bemerkbar:

- Private statische Member-Variable (Typ = Klasse des Singletons)
- Privater Konstruktor
- Nicht kopierbar
- Nicht ableitbar (final)
- Public static Methode "getInstance()" die Typ = Klasse des Singletons zurück gibt und zwar den Wert, der in der statischen Member-Variable ist (wenn noch kein Wert drin ist, wird mit new Klasse() einer angelegt).
 

Tiyen

Mitglied
ok was Singleton ist, habe ich jetzt verstanden. Das einzigste was mich ein bisschen verwirrt ist, diese getInstance() Methode. Wird die automatisch beim Zugriff auf die Klasse PIDGenerator aufgerufen? Weil normalerweise ist es doch so bei Methoden, dass die nur per Zugriff aufgerufen werden.

Java:
import java.util.*;

public class PIDGenerator {

	private static int zaehler = 1;
	private static PIDGenerator instance = null;

	// Konstruktor
	public PIDGenerator() {
	}

	// Statische Methode liefert einzige Instanz dieser Klasse zurück
	public static PIDGenerator getInstance() {
		if (instance == null) {
			instance = new PIDGenerator();
		}
		return instance;
	}

	// Generieren der PID
	protected static String generieren(String pid) {
		pid = "" + zaehler++;
		return pid;
	}
}
 

saftmeister

Nutze den Saft!
Nein, die wird nicht automatisch aufgerufen. Du hast auch noch einen Fehler in deiner Klasse: der Konstruktor ist öffentlich, also können beliebig viele Instanzen der Klasse erzeugt werden.
 

Tiyen

Mitglied
ach da hatte ich das problem, weil wenn ich den konstruktor auf private gestellt habe konnte ich von der main aus nicht mehr auf den generator zugreifen weil der dann diesen "not Visible" Error gezeigt hat.
 

saftmeister

Nutze den Saft!
Du kannst da schon noch zugreifen, halt nur noch über die getInstance()-Methode. Und die liefert dir immer das gleiche identische Objekt zurück. Ein "new Klasse()" funktioniert dann natürlich nicht mehr. Aber sowas wie "Klasse objekt = Klasse.getInstance();" geht dann. Völlig egal wo im Code das so gerufen wird, du wirst immer das gleiche Objekt (=> Object-ID siehe oben) zurück bekommen.