Konstruktor mit Datum

Robotron

Mitglied
Hallo,


ich bin Java-Rookie und möchte Objekte anhand einer Klasse erzeugen, die jeweils ein objektspezifisches Datum enthalten: und zwar eine Klasse "Mitarbeiter" (im Projekt Unternehmen) soll für jeden Mitarbeiter nicht nur Name, Abteilung und Beruf liefern, sondern auch das Einstellungsdatum.


Für die Objekterzeugung habe ich in der Klasse "Mitarbeiter" die folgenden Variablen festgelegt:


Java:
public int Tag;
public int Monat;
public int Jahr;
protected int Personalnummer = Mitarbeiter_Anzahl + 1;
protected String Name;
protected String Abteilung;
protected String Beruf;
protected LocalDate Einstellungsdatum = LocalDate.of(Tag, Monat, Jahr);


(Die Mitarbeiter_Anzahl für die Generierung der Personalnummer wird aus einem Interface implementiert.)


Für die Objekterzeugung habe ich dann einen Konstruktor in der Klasse "Mitarbeiter" erzeugt:


Java:
public Mitarbeiter() {
    this.Personalnummer = Mitarbeiter_Anzahl ++;
    this.Name = Name;
    this.Abteilung = Abteilung;
    this.Beruf = Beruf;
    this.Einstellungsdatum = Einstellungsdatum;
}


Getter und Setter habe ich erzeugt, zur besseren Übersicht lasse ich diese hier weg.


Die folgenden Importe habe ich in der Klasse "Mitarbeiter" gesetzt:

Java:
import java.time.LocalDate;
import java.time.Month;
import java.time.Year;
import java.time.format.DateTimeFormatter;

In der Hauptklasse möchte ich in der Main-Methode wie folgt Objekte der Klasse Mitarbeiter erzeugen:

Java:
Mitarbeiter mitarbeiter1 = new Mitarbeiter();
geselle1.setName("Alfred Altmann");
mitarbeiter1.setAbteilung("Fertigung");
mitarbeiter1.setBeruf("Industriemechaniker");
mitarbeiter1.setEinstellungsdatum(01,07,2012);

Leider klappt das so nicht.


Wahrscheinlich muss ich beim Konstruktor auch die Parameter (Tag, Monat, Jahr) irgendwie berücksichtigen.


Hinzu kommt ja dann noch die Formatierung des Einstellunsdatums, so dass in meinem Beispiel der 01.07.2012 ausgegeben werden soll.


Kann mir bitte jemand dabei weiterhelfen, wie ich Objekte der Klasse "Mitarbeiter" mit einem Einstellungsdatum erzeugen kann bzw.wie man die Parameter Tag, Monat, Jahr im Konstruktor berücksichtigt?


Für Hilfe wäre ich sehr dankbar.

Mod-Edit: Code-Tags
 
Zuletzt bearbeitet von einem Moderator:

MJannek

Bekanntes Mitglied
zuerst wäre es mal gut zu wissen, welche Fehlermeldungen du bekommst. Was mir beim ersten daraufschauen aufgefallen ist, dass du beim Aufruf von
Java:
LocalDate.of(Tag, Monat, Jahr);
Tag und Jahr vertauschen musst. und ich würde es wie folgt machen
Java:
protected LocalDate Einstellungsdatum;

public void setEinstellungsdatum(int tag, int monat, int jahr){
    this.Einsteluungsdatum = LocalDate.of(jahr, monat, tag);
}
Wenn du das gleich beim initialisieren so definierst, kommt eine Fehlermeldung, da Tag, Monat und Jahr noch nicht mit Werten gewüllt wurden. Wenn du deinen Konstuktor in Mitarbeiter so verwenden möchtest musst du diesem noch in der Definition die Werte für Name, Abteilung, Beruf und Einstellungsdatum übergeben. Außerdem würde ich die Variablen im Camelcase (einstellungsDatum) oder Snakecase (einstellungs_Datum) benennen
 

KonradN

Super-Moderator
Mitarbeiter
Also wenn ich da deinen Codeausschnitte ansehe, dann wäre meine erste Empfehlung: Such Dir einen Grundlegenden Ansatz an um Java von Grund auf zu lernen. Per Buch wäre hier z.B. "Java von Kopf bis Fuß" eine gute Wahl. Aber evtl. sind da auch einfach viele Copy & Paste Fehler, so dass mein Eindruck komplett falsch war.

Aber schauen wir einmal die Punkte an, die mir so ins Auge gefallen sind:

1. Code bitte in Code-Tags posten. Das geht am einfachsten über den Knopf </> links oberhalb des Eingabefeldes für Deinen Post.

2. Keine Parameter beim Konstruktor und vermutlich auch unklar, was die Parameter vom Setter beim Einstellungsdatum sind.

public Mitarbeiter() {


this.Personalnummer = Mitarbeiter_Anzahl ++;


this.Name = Name;


this.Abteilung = Abteilung;


this.Beruf = Beruf;


this.Einstellungsdatum = Einstellungsdatum;}

Der Konstruktor Mitarbeiter hat keine Parameter. Daher dann später der Aufruf ohne Argumente. Und die Zuweisungen bringen dann natürlich auch (fast) alle nichts.
Da z.B. die Instanzvariable Name nicht durch einen Parameter Name verdeckt wird, sind this.Name und Name gleich. Der Inhalt der Instanzvariable Name wird der Instanzvariable Name zugewiesen ....

Der Setter vom Einstellungsdatum wird vermutlich nur ein Parameter nehmen vom Typ LocalDate. Wenn Du das nicht zu drei Parametern ändern willst wie von MJannek gezeigt, kannst Du beim Aufruf auch direkt das LocalDate erzeugen. Also etwas wie setEinstellungsDatum(LocalDateOf(jahr, monat, tag));

3. Was machst Du da mit einem Interface?
(Die Mitarbeiter_Anzahl für die Generierung der Personalnummer wird aus einem Interface implementiert.)
Das braucht evtl. noch eine gewisse zusätzliche Erläuterung. Es klingt erst einmal dubios. Typisch wäre eigentlich etwas wie eine statische Variable Mitarbeiter_Anzahl

4. Reihenfolge der Initialisierung!
public int Tag;


public int Monat;


public int Jahr;


// ...


protected LocalDate Einstellungsdatum = LocalDate.of(Tag, Monat, Jahr);

Tag, Monat und Jahr werden nicht direkt initialisiert. Dadurch erfolgt bei Einstellungsdatum immer eine Initialisierung bon LocaleDate.of(0, 0, 0).
(Das mit der Reihenfolge der Parameter wurde ja schon genannt - Jahr Monat Tag ist die Reihenfolge!)

Wichtig ist: Das läuft einmal durch. Wenn dann später Tag, Monat oder Jahr verändert werden, dann verändert sich das Einstellungsdatum nicht.

Dann paar generelle Hinweise - die aber keine wirklichen Fehler sind

5. Die übliche Namensgebung bei Instanzvariablen und Parametern ist das Lower Camel Case. Also tag, monat, einstellungsDatum, ....
Also erster Buchstabe klein und bei zusammengesetzten Wörtern die jeweils folgenden "Anfangsbuchstaben" groß.

6. Keine Werte mehrfach speichern. Wenn Du das Einstellungsdatum in einem LocalDate speicherst, dann solltest Du da nicht zusätzlich Tag, Monat und Jahr vorhalten. Doppelt gespeicherte Daten können leicht mal auseinander gehen und dann hat schwer zu findende Fehler.
 

Robotron

Mitglied
Hallo,

ich danke euch erst mal für eure Hilfe. Leider bin ich noch nicht weiter gekommen.
Immerhin möchte ich durch mein Vorhaben, Objekte für Personen mit einem objektspezifischen Datum zu erzeugen, ein gewisses Verständnis für die Beziehungen zwischen Objekten, Klassen, Konstruktoren ezc. erwerben.

Also ich möchte Objekte für Mitarbeiter eines Unternehmen erstellen und habe dafür eine Klasse "Mitarbeiter" erzeugt.

package Tochter_Unternehmen;
import java.time.LocalDate;
public class Mitarbeiter {

//Klassenvariablen
private static int Mitarbeiter_Anzahl = 0;

//Objektvariablen
public int Tag;
public int Monat;
public int Jahr;
public int Personalnummer = Mitarbeiter_Anzahl + 1;
public String Name;
public String Abteilung;
public String Aufgabe;
public int Stundenlohn;
public LocalDate Einstellungsdatum = LocalDate.of(Tag, Monat, Jahr);


//Objektmethoden
public void ausgabe_Mitarbeiter() {System.out.println(
"Name: "+ Name + "\n" +
"Personalnummer: " + Personalnummer + "\n"
+"Abteilung: " + Abteilung + "\n" +
"Aufgabe: " + Aufgabe + "\n" +
"Stundenlohn: " + Stundenlohn + "\n" +
"Einstellungsdatum: " + Einstellungsdatum + "\n");}


public void setEinstellungsdatum(int Tag, int Monat, int Jahr){
this.Einstellungsdatum = LocalDate.of(Jahr, Monat, Tag);}

//Konstruktor
public Mitarbeiter(int Personalnummer, String Name, String Abteilung, String Aufgabe, int Stundenlohn, LocalDate Einstellungsdatum) {
this.Personalnummer = Mitarbeiter_Anzahl ++;
this.Name = Name;
this.Abteilung = Abteilung;
this.Aufgabe = Aufgabe;
this.Stundenlohn = Stundenlohn;
this.Einstellungsdatum = Einstellungsdatum;}
}

Die Variablen habe ich erst einmal (zur Vereinfachung) auf Public gesetzt.
Ich habe die o..g. Variablen festgelegt und den Konstruktor erzeugt.

In der Hauptklasse mit der Main-Methode möchte ich nun die Objekte erzeugen mit folgendem Code:

Mitarbeiter mitarbeiter1 = new Mitarbeiter(0, "Manne Murmelauge", "Kantine", "Kochen", 14, 2012,07,01);

Das klappt leider nicht.
Leider habe ich mit dem Initialisieren und Übergeben von Variablen noch große Probleme.

Könnte mir nicht jemand einen Beispiel-Code schreiben für mein Vorhaben. So würde ich sehen, wie man das macht.
Ich habe leider nirgends einen gefunden.

Für Hilfe wäre ich dankbar.
 

bärrr

Mitglied
Man könnte es so machen:

Java:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Mitarbeiter {
    // Klassenvariablen
    private static int mitarbeiter_anzahl = 0;

    // Objektvariablen
    public int personalnummer = ++mitarbeiter_anzahl;
    public String name;
    public String abteilung;
    public String aufgabe;
    public int stundenlohn;
    public Date ersteEinstellungDatum;

    // Konstruktor
    public Mitarbeiter(int personalnummer, String name, String abteilung, String aufgabe, int stundenlohn) {
        this.name = name;
        this.abteilung = abteilung;
        this.aufgabe = aufgabe;
        this.stundenlohn = stundenlohn;
    }

    // Objektmethoden
    public Mitarbeiter setErsteEinstellungDatum(Date ersteEinstellungDatum) {
        if (this.ersteEinstellungDatum != null) {
            throw new IllegalArgumentException("Das Datum der ersten Einstellung kann nicht geändert werden.");
        }
        this.ersteEinstellungDatum = ersteEinstellungDatum;
        return this;
    }

    /**
     * Setzt das Datum der ersten Einstellung
     *
     * @param Jahr  das Jahr der ersten Einstellung (z. B. 2025)
     * @param Monat der Monat der ersten Einstellung (0-11)
     * @param Tag   der Tag der ersten Einstellung (1-31)
     * @return das Mitarbeiter-Objekt
     */
    public Mitarbeiter setErsteEinstellungDatum(int Jahr, int Monat, int Tag) {
        if (this.ersteEinstellungDatum != null) {
            throw new IllegalArgumentException("Das Datum der ersten Einstellung kann nicht geändert werden.");
        }
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(0);
        cal.set(Jahr, Monat, Tag);
        ersteEinstellungDatum = cal.getTime();
        return this;
    }

    public String getErsteEinstellungDatumAsText() {
        if (ersteEinstellungDatum == null) {
            return "nicht festgelegt";
        }
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
        return sdf.format(ersteEinstellungDatum);
    }

    public Date getErsteEinstellungDatumAsDate() {
        return ersteEinstellungDatum;
    }

    @Override
    public String toString() {
        return String.join("\n",
                "Personalnummer: " + personalnummer,
                "Name: " + name,
                "Abteilung: " + abteilung,
                "Aufgabe: " + aufgabe,
                "Stundenlohn: " + stundenlohn,
                "Erste Einstellung: " + getErsteEinstellungDatumAsText());
    }

    // Testing
    public static void main(String[] args) {
        System.out.println(
                new Mitarbeiter(1, "Max Mustermann", "Vertrieb", "Verkauf", 10)
                        .setErsteEinstellungDatum(2025, 0, 15));
    }
}

Wichtig ist, dass Variablen und Methoden mit einem Kleinbuchstaben anfangen (lowerCamelCase) und dass der Ctor eigentlich nicht mehr als 3-4 Parameter haben sollte.
 

Jw456

Top Contributor
Mitarbeiter mitarbeiter1 = new Mitarbeiter(0, "Manne Murmelauge", "Kantine", "Kochen", 14, 2012,07,01);
Hallo Bein erzeugen des Objektes mit new müsstest du eigentlich eine Fehlermeldung bekommen. Oder deine DIE müsste das auch anmeckern .

Schaue dir den letzten Parameter in Konstruktor an von welchen Datentyp ist er. Was übergibst du beim Objekt erzeugen mit new. Das passt nicht zusammen.
Du willst ein Datum vom Datentyp LocalDate Übergeben dann tue das auch und nicht einfach drei int werte.

Java:
  Mitarbeiter mitarbeiter1 = new Mitarbeiter(0, "Manne Murmelauge", "Kantine", "Kochen", 14, LocalDate.of(2012,07,01));
 

Oneixee5

Top Contributor
Man könnte es so machen:

Java:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Mitarbeiter {
    // Klassenvariablen
    private static int mitarbeiter_anzahl = 0;

    // Objektvariablen
    public int personalnummer = ++mitarbeiter_anzahl;
    public String name;
    public String abteilung;
    public String aufgabe;
    public int stundenlohn;
    public Date ersteEinstellungDatum;

    // Konstruktor
    public Mitarbeiter(int personalnummer, String name, String abteilung, String aufgabe, int stundenlohn) {
        this.name = name;
        this.abteilung = abteilung;
        this.aufgabe = aufgabe;
        this.stundenlohn = stundenlohn;
    }

    // Objektmethoden
    public Mitarbeiter setErsteEinstellungDatum(Date ersteEinstellungDatum) {
        if (this.ersteEinstellungDatum != null) {
            throw new IllegalArgumentException("Das Datum der ersten Einstellung kann nicht geändert werden.");
        }
        this.ersteEinstellungDatum = ersteEinstellungDatum;
        return this;
    }

    /**
     * Setzt das Datum der ersten Einstellung
     *
     * @param Jahr  das Jahr der ersten Einstellung (z. B. 2025)
     * @param Monat der Monat der ersten Einstellung (0-11)
     * @param Tag   der Tag der ersten Einstellung (1-31)
     * @return das Mitarbeiter-Objekt
     */
    public Mitarbeiter setErsteEinstellungDatum(int Jahr, int Monat, int Tag) {
        if (this.ersteEinstellungDatum != null) {
            throw new IllegalArgumentException("Das Datum der ersten Einstellung kann nicht geändert werden.");
        }
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(0);
        cal.set(Jahr, Monat, Tag);
        ersteEinstellungDatum = cal.getTime();
        return this;
    }

    public String getErsteEinstellungDatumAsText() {
        if (ersteEinstellungDatum == null) {
            return "nicht festgelegt";
        }
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
        return sdf.format(ersteEinstellungDatum);
    }

    public Date getErsteEinstellungDatumAsDate() {
        return ersteEinstellungDatum;
    }

    @Override
    public String toString() {
        return String.join("\n",
                "Personalnummer: " + personalnummer,
                "Name: " + name,
                "Abteilung: " + abteilung,
                "Aufgabe: " + aufgabe,
                "Stundenlohn: " + stundenlohn,
                "Erste Einstellung: " + getErsteEinstellungDatumAsText());
    }

    // Testing
    public static void main(String[] args) {
        System.out.println(
                new Mitarbeiter(1, "Max Mustermann", "Vertrieb", "Verkauf", 10)
                        .setErsteEinstellungDatum(2025, 0, 15));
    }
}

Wichtig ist, dass Variablen und Methoden mit einem Kleinbuchstaben anfangen (lowerCamelCase) und dass der Ctor eigentlich nicht mehr als 3-4 Parameter haben sollte.
Das scheint alles ziemlich sinnfrei und an der Frage vorbei.
 

KonradN

Super-Moderator
Mitarbeiter
So wie von Jw123 gezeigt sollte man es natürlich nicht machen.
Bitte gib doch auch eine Begründung an. Was spricht gegen ein solches Vorgehen?

Und wieso ist Deine Lösung besser, die nach einem Konstruktor-Aufruf dann erst einmal einen unvollständiges Objekt hat (Einstellungsdatum bei Mitarbeitern dürfte eher nicht optional sein...) Also einen Parameter aus dem Konstruktor nehmen und nur als Setter bereit zu stellen, ist aus meiner Sicht deutlich problematischer als der Ansatz von Jw123.

Was hier eine sinnvolle Lösung sein könnte ist ein Builder Ansatz. Das wäre dann in etwa sowas:

Java:
public class Mitarbeiter {

    private static int mitarbeiterAnzahl = 0;

    private final int personalnummer;
    private final String name;
    private final String abteilung;
    private final String aufgabe;
    private final int stundenlohn;
    private final LocalDate einstellungDatum;

    private Mitarbeiter(Builder builder) {
        this.personalnummer = ++mitarbeiterAnzahl;
        this.name = builder.name;
        this.abteilung = builder.abteilung;
        this.aufgabe = builder.aufgabe;
        this.stundenlohn = builder.stundenlohn;
        this.einstellungDatum = builder.einstellungDatum;

        if (this.einstellungDatum == null) {
            throw new IllegalArgumentException("Einstellungsdatum muss angegeben werden.");
        }
    }

    public static class Builder {
        private String name;
        private String abteilung;
        private String aufgabe;
        private int stundenlohn;
        private LocalDate einstellungDatum;

        public Builder name(String name) {
            this.name = name;
            return this;
        }

        public Builder abteilung(String abteilung) {
            this.abteilung = abteilung;
            return this;
        }

        public Builder aufgabe(String aufgabe) {
            this.aufgabe = aufgabe;
            return this;
        }

        public Builder stundenlohn(int stundenlohn) {
            this.stundenlohn = stundenlohn;
            return this;
        }

        public Builder einstellungDatum(int tag, int monat, int jahr) {
            this.einstellungDatum = LocalDate.of(jahr, monat, tag);
            return this;
        }

        public Builder einstellungDatum(LocalDate einstellungDatum) {
            this.einstellungDatum = einstellungDatum;
            return this;
        }

        public Mitarbeiter build() {
            return new Mitarbeiter(this);
        }
    }

    public static void main(String[] args) {
        Mitarbeiter arbeiter = new Builder()
                .name("Name")
                .abteilung("Abteilung")
                .aufgabe("Aufgabe")
                .stundenlohn(25)
                .einstellungDatum(1,1,2024)
                .build();
    }
}

Kernpunkte beim Builder Pattern sind:
  • Der Konstruktor ist ggf. private und kann daher nicht direkt aufgerufen werden
  • Es gibt eine innere Klasse Builder, welche die Werte, die gesetzt werden können, auch noch einmal hat.
  • Der Builder hat dann setter ohne set, welche als fluent API ausgelegt ist. Es wird also immer die Instanz der Builders zurück gegeben, so dass Aufrufe in einer Kette erfolgen können.
  • Der Builder hat dann eine build Methode, die das eigentliche Objekt erzeugt.

Angedeutet ist dann auch, wie eine mögliche Validierung aussehen kann, also dass z.B. ein einstellungDatum gesetzt werden muss.
 

Jw456

Top Contributor
Tut mir leid für dich, aber ich habe nur den gegebenen Code verbessert...

So wie von Jw123 gezeigt sollte man es natürlich nicht machen.
Es ging hier ja um diese Aussage des TE. Dass die Objekt Erstellung nicht Funktionierte.
Denn Konstruktor hat er ja selber geschrieben und wollte ihn benutzen.

Das er natürlich bei dem erstellen der Attribute (Instanzvariablen) auch einen Fehler hat wurde ihm schon in Post #3 gesagt.

Ich finde es schon wichtig für den TE zu zeigen wo sein Fehler ist warum sein selbst geschriebener Code nicht lauffähig ist.
Verändern verbessern kann man in immer. Wichtig für ihn ist warum ging es nicht mit dem erstellen eines Objektes seiner Klasse.

In der Hauptklasse mit der Main-Methode möchte ich nun die Objekte erzeugen mit folgendem Code:

Mitarbeiter mitarbeiter1 = new Mitarbeiter(0, "Manne Murmelauge", "Kantine", "Kochen", 14, 2012,07,01);
 

Jw456

Top Contributor
Dennoch braucht man dann ein Config-Objekt oder das Builder-Pattern, damit die Konstruktorparameteranzahl nicht ins Astronomische ausufert ...
Das steht wieder auf einen ganz andern Blatt Papier.

Er will lernen und wollte versuchen ein Objekt von seiner Klasse zu erstellen, ob die gut ist oder Verbesserungs würdig ist wieder ein andrer Punkt.

Das es bestimmte Entwurfs Muster gibt wird er schon noch raus bekommen .

Im Moment scheint er noch bei den Grundlagen zu sein .

Bei den Entwurfs Mustern wird er noch nicht sein.
 

Robotron

Mitglied
Man könnte es so machen:

Java:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Mitarbeiter {
    // Klassenvariablen
    private static int mitarbeiter_anzahl = 0;

    // Objektvariablen
    public int personalnummer = ++mitarbeiter_anzahl;
    public String name;
    public String abteilung;
    public String aufgabe;
    public int stundenlohn;
    public Date ersteEinstellungDatum;

    // Konstruktor
    public Mitarbeiter(int personalnummer, String name, String abteilung, String aufgabe, int stundenlohn) {
        this.name = name;
        this.abteilung = abteilung;
        this.aufgabe = aufgabe;
        this.stundenlohn = stundenlohn;
    }

    // Objektmethoden
    public Mitarbeiter setErsteEinstellungDatum(Date ersteEinstellungDatum) {
        if (this.ersteEinstellungDatum != null) {
            throw new IllegalArgumentException("Das Datum der ersten Einstellung kann nicht geändert werden.");
        }
        this.ersteEinstellungDatum = ersteEinstellungDatum;
        return this;
    }

    /**
     * Setzt das Datum der ersten Einstellung
     *
     * @param Jahr  das Jahr der ersten Einstellung (z. B. 2025)
     * @param Monat der Monat der ersten Einstellung (0-11)
     * @param Tag   der Tag der ersten Einstellung (1-31)
     * @return das Mitarbeiter-Objekt
     */
    public Mitarbeiter setErsteEinstellungDatum(int Jahr, int Monat, int Tag) {
        if (this.ersteEinstellungDatum != null) {
            throw new IllegalArgumentException("Das Datum der ersten Einstellung kann nicht geändert werden.");
        }
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(0);
        cal.set(Jahr, Monat, Tag);
        ersteEinstellungDatum = cal.getTime();
        return this;
    }

    public String getErsteEinstellungDatumAsText() {
        if (ersteEinstellungDatum == null) {
            return "nicht festgelegt";
        }
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
        return sdf.format(ersteEinstellungDatum);
    }

    public Date getErsteEinstellungDatumAsDate() {
        return ersteEinstellungDatum;
    }

    @Override
    public String toString() {
        return String.join("\n",
                "Personalnummer: " + personalnummer,
                "Name: " + name,
                "Abteilung: " + abteilung,
                "Aufgabe: " + aufgabe,
                "Stundenlohn: " + stundenlohn,
                "Erste Einstellung: " + getErsteEinstellungDatumAsText());
    }

    // Testing
    public static void main(String[] args) {
        System.out.println(
                new Mitarbeiter(1, "Max Mustermann", "Vertrieb", "Verkauf", 10)
                        .setErsteEinstellungDatum(2025, 0, 15));
    }
}

Wichtig ist, dass Variablen und Methoden mit einem Kleinbuchstaben anfangen (lowerCamelCase) und dass der Ctor eigentlich nicht mehr als 3-4 Parameter haben sollte.
Vielen Dank, das hat so geklappt. Ich muss mich natürlich mit den einzelnen Schrittten genauer beschäftigen.
Ggf. frage ich später noch einmal etwas zu einzelnen Schritten.
 

Robotron

Mitglied
Bitte gib doch auch eine Begründung an. Was spricht gegen ein solches Vorgehen?

Und wieso ist Deine Lösung besser, die nach einem Konstruktor-Aufruf dann erst einmal einen unvollständiges Objekt hat (Einstellungsdatum bei Mitarbeitern dürfte eher nicht optional sein...) Also einen Parameter aus dem Konstruktor nehmen und nur als Setter bereit zu stellen, ist aus meiner Sicht deutlich problematischer als der Ansatz von Jw123.

Was hier eine sinnvolle Lösung sein könnte ist ein Builder Ansatz. Das wäre dann in etwa sowas:

Java:
public class Mitarbeiter {

    private static int mitarbeiterAnzahl = 0;

    private final int personalnummer;
    private final String name;
    private final String abteilung;
    private final String aufgabe;
    private final int stundenlohn;
    private final LocalDate einstellungDatum;

    private Mitarbeiter(Builder builder) {
        this.personalnummer = ++mitarbeiterAnzahl;
        this.name = builder.name;
        this.abteilung = builder.abteilung;
        this.aufgabe = builder.aufgabe;
        this.stundenlohn = builder.stundenlohn;
        this.einstellungDatum = builder.einstellungDatum;

        if (this.einstellungDatum == null) {
            throw new IllegalArgumentException("Einstellungsdatum muss angegeben werden.");
        }
    }

    public static class Builder {
        private String name;
        private String abteilung;
        private String aufgabe;
        private int stundenlohn;
        private LocalDate einstellungDatum;

        public Builder name(String name) {
            this.name = name;
            return this;
        }

        public Builder abteilung(String abteilung) {
            this.abteilung = abteilung;
            return this;
        }

        public Builder aufgabe(String aufgabe) {
            this.aufgabe = aufgabe;
            return this;
        }

        public Builder stundenlohn(int stundenlohn) {
            this.stundenlohn = stundenlohn;
            return this;
        }

        public Builder einstellungDatum(int tag, int monat, int jahr) {
            this.einstellungDatum = LocalDate.of(jahr, monat, tag);
            return this;
        }

        public Builder einstellungDatum(LocalDate einstellungDatum) {
            this.einstellungDatum = einstellungDatum;
            return this;
        }

        public Mitarbeiter build() {
            return new Mitarbeiter(this);
        }
    }

    public static void main(String[] args) {
        Mitarbeiter arbeiter = new Builder()
                .name("Name")
                .abteilung("Abteilung")
                .aufgabe("Aufgabe")
                .stundenlohn(25)
                .einstellungDatum(1,1,2024)
                .build();
    }
}

Kernpunkte beim Builder Pattern sind:
  • Der Konstruktor ist ggf. private und kann daher nicht direkt aufgerufen werden
  • Es gibt eine innere Klasse Builder, welche die Werte, die gesetzt werden können, auch noch einmal hat.
  • Der Builder hat dann setter ohne set, welche als fluent API ausgelegt ist. Es wird also immer die Instanz der Builders zurück gegeben, so dass Aufrufe in einer Kette erfolgen können.
  • Der Builder hat dann eine build Methode, die das eigentliche Objekt erzeugt.

Angedeutet ist dann auch, wie eine mögliche Validierung aussehen kann, also dass z.B. ein einstellungDatum gesetzt werden muss.
Vielen Dank, so habe ich gleich noch das Thema Builder pattern Kennen gelernt.😀
Da muss ich mich auch noch einarbeiten
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Null-Pointer trotz Konstruktor? Java Basics - Anfänger-Themen 9
M Konstruktor-Aufruf im Konstruktor, aber nicht am Anfang? Java Basics - Anfänger-Themen 4
T Schlüsselworte Schlüsselwort this im Konstruktor Java Basics - Anfänger-Themen 3
frager2345 Warum muss ich hier im Konstruktor meine Exeption nicht abfangen ? Java Basics - Anfänger-Themen 4
J Konstruktor Java Basics - Anfänger-Themen 18
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
G Welche Attribute kommen in den Konstruktor? Java Basics - Anfänger-Themen 5
M wird der Konstruktor nicht als 1. ausgeführt? Java Basics - Anfänger-Themen 13
G Konstruktor und update Java Basics - Anfänger-Themen 4
K Kopier-Konstruktor Java Basics - Anfänger-Themen 6
S Default Konstruktor Java Basics - Anfänger-Themen 7
M Konstruktor ohne Übergabe eines Wertes Java Basics - Anfänger-Themen 7
M Wie kann ich in einem Konstruktor die Methode eines anderen Interfaces mit den jeweiligen Parametern aufrufen? Java Basics - Anfänger-Themen 8
J Vier gewinnt in Java,Spieler Konstruktor Java Basics - Anfänger-Themen 8
kxrdelis Konstruktor für ein Rechtwinkliges Dreieck Java Basics - Anfänger-Themen 10
Zeppi OOP Bruch kürzen im Konstruktor Java Basics - Anfänger-Themen 2
HorstSchröder Konstruktor mit Initialwert Java Basics - Anfänger-Themen 1
C Konstruktor ab serialisiertem Objekt Java Basics - Anfänger-Themen 4
J Input/Output Konstruktor ergänzen, der zur Datei mit einem Objekt passt Java Basics - Anfänger-Themen 0
InfinityDE Problem mit Datenübergabe an Konstruktor Java Basics - Anfänger-Themen 7
B Konstruktor mit Array als Parameter Java Basics - Anfänger-Themen 3
G Variablen Array Länge über den Konstruktor definieren Java Basics - Anfänger-Themen 4
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
C Interface und Konstruktor Java Basics - Anfänger-Themen 1
H Generische Konstruktor Java Basics - Anfänger-Themen 12
MiMa Seltsames Verhalten im Konstruktor Java Basics - Anfänger-Themen 6
S Konstruktor passt nicht zum Rest Java Basics - Anfänger-Themen 11
C Unbekannter "Konstruktor"?? Java Basics - Anfänger-Themen 10
W OOP Warenlager mit Array(Konstruktor, Methoden) Java Basics - Anfänger-Themen 39
R Objekt in Konstruktor ist nicht zulässig Java Basics - Anfänger-Themen 5
A Mit einer Methode den Konstruktor aufrufen? Java Basics - Anfänger-Themen 2
B Warum können super() und this() nicht gemeinsam in einem Konstruktor verwendet werden? Java Basics - Anfänger-Themen 7
K Konstruktor für ein Objekt mit Zugriffsmethoden Java Basics - Anfänger-Themen 7
H Unterschied Konstruktor und Klassenname x = new Klassenname; Java Basics - Anfänger-Themen 3
B Klassen Array Parameter im Konstruktor? Java Basics - Anfänger-Themen 4
E Konstruktor mit Methode Java Basics - Anfänger-Themen 7
E ArithmeticException im Konstruktor Java Basics - Anfänger-Themen 4
S Konstruktor, Objekte Java Basics - Anfänger-Themen 4
F Konstruktor richtig implementiert? Frage zu Benutzereingaben... Java Basics - Anfänger-Themen 9
W Typecastin im Konstruktor? Java Basics - Anfänger-Themen 2
A Variablen Variablenwert über Konstruktor ändern Java Basics - Anfänger-Themen 3
F Arrays im Konstruktor Java Basics - Anfänger-Themen 5
C Konstruktor mit und ohne Parameterliste Java Basics - Anfänger-Themen 13
L Instanzvariablen, Veerbung, Konstruktor Java Basics - Anfänger-Themen 32
E Best Practice Konstruktor mit bestehender Intanz der gleichen Klasse aufrufen Java Basics - Anfänger-Themen 4
E Plausibilitätsprüfung in dem Konstruktor mit Ausnahmebehandlung Java Basics - Anfänger-Themen 8
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 7
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 0
D Compiler-Fehler Konstruktor von Superklasse übernehmen Java Basics - Anfänger-Themen 1
P Counter im Konstruktor Java Basics - Anfänger-Themen 11
J toString-Methode in Verbindung mit varArgs-Konstruktor Java Basics - Anfänger-Themen 18
I Einträge in den Konstruktor Java Basics - Anfänger-Themen 3
Aprendiendo [JAVA-Syntax] (int... variable) bei einem Konstruktor Java Basics - Anfänger-Themen 8
J Superklassen Konstruktor Verständnisfrage Java Basics - Anfänger-Themen 1
G Int-Array im Konstruktor Parameter Java Basics - Anfänger-Themen 37
T Datentypen Warum mit Konstruktor Objektvariablen initalisieren? Java Basics - Anfänger-Themen 19
A Vererbung bei Klassen mit Objekt der Klasse im Konstruktor Java Basics - Anfänger-Themen 4
P Konstruktor. Java Basics - Anfänger-Themen 4
D Best Practice Objekt automatisch im Konstruktor füllen? Java Basics - Anfänger-Themen 9
D Objekt oder Konstruktor Java Basics - Anfänger-Themen 2
F Java default Konstruktor Java Basics - Anfänger-Themen 1
R Fragen über den Konstruktor Java Basics - Anfänger-Themen 0
T Konstruktor mit Referenzdatentypen Java Basics - Anfänger-Themen 5
H Klassen Konstruktor Parameter als Instanzvariablen zwischen speichern... Java Basics - Anfänger-Themen 11
T setter im Konstruktor einbauen? Java Basics - Anfänger-Themen 8
R ArrayList im Konstruktor. Java Basics - Anfänger-Themen 4
T Konstruktor Probleme Java Basics - Anfänger-Themen 3
J Wie lässt sich der Konstruktor einer Klasse einer Funktion einer Klasse nutzen. Java Basics - Anfänger-Themen 4
S Variable, die im Konstruktor gesetzt wird, wird nicht gefunden vom Compiler. Java Basics - Anfänger-Themen 4
C Generic im Konstruktor Java Basics - Anfänger-Themen 1
F Privater Konstruktor und statische Methoden Java Basics - Anfänger-Themen 4
W Konstruktor von FileInputStream nicht gefunden Java Basics - Anfänger-Themen 18
B Methoden Konstruktor im Konstruktor aufrufen Java Basics - Anfänger-Themen 2
N Aufgabe: Pizza Konstruktor mit mehreren beliebigen Durchmesser/Preiskombinationen Java Basics - Anfänger-Themen 8
K arraygröße durch variablen Konstruktor? Java Basics - Anfänger-Themen 7
K ArrayList in Konstruktor - wie späterer Zugriff Java Basics - Anfänger-Themen 2
G Verwendung von Konstruktor Java Basics - Anfänger-Themen 8
X Übergabeparameter Konstruktor (File) Java Basics - Anfänger-Themen 13
K Wieso muss man finale statische Variablen sofort oder eben im Konstruktor initialisieren? Java Basics - Anfänger-Themen 2
C Konstruktor in Abstrakten Klassen Java Basics - Anfänger-Themen 4
B Konstruktor Problem Java Basics - Anfänger-Themen 8
Joew0815 konstruktor und damit erstellte objekte Java Basics - Anfänger-Themen 1
K Hashtable mit eigenen Konstruktor Java Basics - Anfänger-Themen 2
S Java Fragen Konstruktor & Statische Methoden Java Basics - Anfänger-Themen 4
H Fehler im Konstruktor abfangen Java Basics - Anfänger-Themen 10
J Konstruktor Problem bei Vererbung Java Basics - Anfänger-Themen 1
I Java Eingabe aus einer anderen Klasse in eine andere an Konstruktor übergeben Java Basics - Anfänger-Themen 4
O Konstruktor und Default Konstruktor Java Basics - Anfänger-Themen 7
S Kapselung Objekt bei Übergabe an Konstruktor nicht initalisiert Java Basics - Anfänger-Themen 3
I Vererbung Frage zum Konstruktor Java Basics - Anfänger-Themen 5
Y Konstruktor - Setter/Getter Java Basics - Anfänger-Themen 3
P Konstruktor Java Basics - Anfänger-Themen 4
E Initialisierung von Attributen und Konstruktor Java Basics - Anfänger-Themen 0
H Compiler-Fehler NullPointerException bei .length, Konstruktor fehlerhaft? Java Basics - Anfänger-Themen 3
M Objekt Array an konstruktor übergeben und Initialisieren Java Basics - Anfänger-Themen 1
llabusch Vererbung Super Konstruktor Java Basics - Anfänger-Themen 5
P Erste Schritte WindowBuilder erstellt Konstruktor wie zugreifen Java Basics - Anfänger-Themen 5
M Parameter von Konstruktor, der Superklassen-Konstruktor aufruft Java Basics - Anfänger-Themen 2
V Was soll alles in den Konstruktor? Java Basics - Anfänger-Themen 3
J Objektwerte addieren / Konstruktor Java Basics - Anfänger-Themen 19

Ähnliche Java Themen


Oben