Zähler hochzählen lassen

Hallo, ich hoffe ihr könnt mir helfen.
Wir sollen für eine Hausübung in der Uni quasi eine kleine Patientendatenbank entwerfern, in der jeder Fall eine Fallzahl zugewiesen bekommt. Soweit so gut, nun versuche ich schon dauernd, dass der 1. Fall die 1 bekommt, der 2. die 2 und so weiter. Die Fallzahl am Ende (also insgesamt) ist richtig, nur das mit dem mitzählen bekomme ich irgendwie nicht hin.

Meine Klasse Patient sieht folgendermaßen aus:


public class Patient {
	private String vorname;
	private String name;
	private String aufnahme;
	private String entlassung;
	
	// Klassenvariablen
	private static int fallzahl;
	private static int fallzahlzaehler = 0;
	
	public Patient (String vorname, String name, String aufnahme, String entlassung){
		this.vorname = vorname;
		this.name = name;
		this.aufnahme = aufnahme;
		this.entlassung = entlassung;
		fallzahl = fallzahlzaehler;
		fallzahlzaehler++;
	
	}

	public static int getFallzahl() {
		return fallzahl;
	}

	public static int getFallzahlzaehler() {
		return fallzahlzaehler;
	}

	public String getVorname() {
		return vorname;
	}

	public String getName() {
		return name;
	}

	public String getAufnahme() {
		return aufnahme;
	}

	public String getEntlassung() {
		return entlassung;
	}

	
	}


Soweit so gut, nun kommen wir also zu meiner Main-Methode, wo das ganze auch ausgegeben wird.


public class Application {

	public static void main(String[] args) {
		Patient p1 = new Patient("Müller", "Horst", "01.01.2014", "05.01.2014");
		Patient p2 = new Patient("xy", "abc", "07.11.2014", "22.11.2014");
		
		
		
		System.out.println("Erster Patient: "+p1.getVorname()+" "+p1.getName()+" "+p1.getAufnahme()+" "+p1.getEntlassung()+" "+Patient.getFallzahl());
		System.out.println("Zweiter Patient: "+p2.getVorname()+" "+p2.getName()+" "+p2.getAufnahme()+" "+p2.getEntlassung()+" "+Patient.getFallzahl());
		
		
		System.out.println("Fallzahl "+Patient.getFallzahlzaehler());

	}

}

Die richtige komplette Fallzahl ist ja 2, sind ja 2 Fälle. Allerdings steht diese 2 nun auch hinter den beiden Fällen, und da ist mein Problem. Wie behebe ich das am besten?

Die Variable fallzahl sollte eine Instanzvariable sein. Außerdem wäre wohl der Name “fallnummer” treffender.

Hm. Naja gut aber hilft mir in dem Punkt irgendwie nicht weiter :confused:

fallzahl darf nicht statisch sein, muss pro Objekt einzeln gespeichert werden

eine statische Methode dafür bisher und Aufruf Patient.getFallzahl() ist zwar konsequent,
aber zeigt doch umso mehr, wie abwegig dann die Annahme getrennter Werte ist, warum sollte das ausgegeben werden?
es muss natürlich ein Aufruf auf p1 und p2 sein, wie die anderen

edit:

wie könnte das nicht weiterhelfen? oder mein Posting deutlicher?


für so ein kontrolliertes Konstrukt bietet sich dann auch nur eine Zeile
fallzahl = fallzahlzaehler++;
an, wenn man einmal geprüft hat, ob richtig,

obwohl ich normalerweise eher die Variante getrennter Zeilen wegen der Eindeutigkeit lobe :wink:

Naja doch, das ist genau dein Problem. Etwas weiter unten von SlaterB nochmal etwas konkretisiert.

Daaaaanke es hat funktioniert, jetzt hab ich meinen Fehler auch bemerkt. Muss ja für jedes Objekt geändert werden, klaro :slight_smile: Danke nochmal.

Ich hab’s verändert.

Mache das doch so, mit statisch-innerer Klassenfabrikmethode:

 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication1;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author (CB u. a., et al., et alii)
 */
public class Patient {

    private static class FallGen {

        private static FallGen fallGen = null;
        private int nextFallNo = 0;

        private /*synchronized*/ static FallGen newFallGen() {
            if (fallGen == null) {
                fallGen = new FallGen();
            }
            return fallGen;
        }

        private FallGen() {
        }

        private synchronized int getNextFallNo() {
            return ++nextFallNo;
        }

        @Override
        public synchronized String toString() {
            return "FallGen{" + "nextFallNo=" + nextFallNo + '}';
        }
    }
    private String vorname;
    private String name;
    private String aufnahme;
    private String entlassung;
    private int fallNo = FallGen.newFallGen().getNextFallNo();

    public Patient(String vorname, String name, String aufnahme, String entlassung) {
        this.vorname = vorname;
        this.name = name;
        this.aufnahme = aufnahme;
        this.entlassung = entlassung;

    }

    public int getFallNo() {
        return fallNo;
    }

    public int getFallzahlzaehler() {
        return Integer.parseInt(FallGen.newFallGen().toString().substring(19).replace("}", ""));
    }

    public String getVorname() {
        return vorname;
    }

    public String getName() {
        return name;
    }

    public String getAufnahme() {
        return aufnahme;
    }

    public String getEntlassung() {
        return entlassung;
    }

    public static void main(String[] args) {
        SimpleDateFormat sdf = (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.MEDIUM);
        Patient p1 = new Patient("Max", "Muster234", sdf.format(new Date()), sdf.format(System.currentTimeMillis() + 24 * 60 * 60 * 1000));
        System.out.println("p1.getFallNo() = " + p1.getFallNo());
        System.out.println("p1.getFallzahlzaehler() = " + p1.getFallzahlzaehler());
        Patient p2 = new Patient("Max", "Muster543", sdf.format(new Date()), sdf.format(System.currentTimeMillis() + 48 * 60 * 60 * 1000));
        System.out.println("p1.getFallNo() = " + p1.getFallNo());
        System.out.println("p1.getFallzahlzaehler() = " + p1.getFallzahlzaehler());
        System.out.println("p2.getFallNo() = " + p2.getFallNo());
        System.out.println("p2.getFallzahlzaehler() = " + p2.getFallzahlzaehler());
    }
}```

Ich hab's getestet, es funktioniert alles, wenn die Zugriffsmodifier nicht falsch sind;, und wenn zu Beginn/Start nicht zufällig zwei oder mehrere Patienten gleichzeitig erstellt/angelegt werden (müssen).

Na man kanns aber auch übertreiben…
Der TO hat ein Problem mit static/non-static, und du wirfst ihm da so ein Konstrukt entgegen.

Da finde ich die Lösung vom TO außerdem noch schöner als dein kompliziertes singleton-Konstrukt.

Nagut, das war ein Trade-off. private static FallGen fallGen = new FallGen(); => das Programm braucht etwas länger zum Starten, private synchronized static FallGen newFallGen() { => jeder Aufruf der Methode braucht etwas länger. Neben dem auch nicht ganz richtig, denn private static class FallGen { + private FallGen() { => FallGen kann auch innerhalb der umgebenen Klasse Patient instantiiert werden. - Irgendwann kann auch „private method through a public ona“ auftreten. - Verwirrt mich alles selber ein bissel.

Mach’s einfach, wies bereits angemerkt wurde.

(Vielleicht [auch] einfach wieder nur was schreiben, nach langer Zeit [offtopic: Außerdem ist Holland Matchwinner geworden :slight_smile: {nix gegen das andere Team!}])