From e6e59766b613aefb13e1596384d4fe6b6f98f73d Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 7 Apr 2022 14:07:14 +0200 Subject: [PATCH] doppeltes aufnehmen verhindert, equals, hashcode (Old and new) --- src/model/Arzt.java | 38 ++- src/model/Freelancer.java | 281 +++++++++--------- src/model/Mitarbeiter.java | 443 ++++++++++++++-------------- src/model/Personalbuero.java | 149 ++++++---- src/test/TestImport.java | 14 +- src/test/TestPersonalbueroMain.java | 14 +- 6 files changed, 510 insertions(+), 429 deletions(-) diff --git a/src/model/Arzt.java b/src/model/Arzt.java index 8b71f1e..2ba8176 100644 --- a/src/model/Arzt.java +++ b/src/model/Arzt.java @@ -5,20 +5,29 @@ import java.time.Year; * Klasse Arzt * * @author (WES) - * @version (2022-03-31) + * @version (2022-04-05) * * umgestellt auf Exception-Handling * mit freiwilliger Uebung toStringCsv() * mit freiwilliger Uebung public Arzt (String[] zeilenTeile) + * mit public Arzt(String[] zeilenTeile) + * mit setAllFields(String[] zeilenTeile) */ + public class Arzt extends Mitarbeiter implements GehaltBerechenbar { - private static final long serialVersionUID = 2022_03_22__13_15L; + private static final long serialVersionUID = 2022_04_05__12_40L; private int wochenStunden; private float fixum; - // FUE - // public Arzt (String[] zeilenTeile) // TODO + // FUE 2002-04-01 + // public Arzt (String[] zeilenTeile) + + public Arzt (String[] zeilenTeile) throws PersonalException + { + super(zeilenTeile); + setAllFields(zeilenTeile); + } public Arzt(String name, char gesch, Year gebJahr, Year eintrJahr, int wochenStunden, float fixum) throws PersonalException { @@ -42,6 +51,27 @@ public class Arzt extends Mitarbeiter implements GehaltBerechenbar else throw new PersonalException("Fehler bei setFixum(): Wert von fixum muss groesser 0.0 sein (" + fixum + ")"); } + + private void setAllFields(String[] zeilenTeile) throws PersonalException + { + try { + // 10; 1000.0 + // [5] [6] im Array zeilenTeile + setWochenStunden(Integer.parseInt(zeilenTeile[5].trim())); // "10" + // throws NumberFormatException bei Integer.parseInt + setFixum(Float.parseFloat(zeilenTeile[6].trim())); // "1000.0" + } + catch(ArrayIndexOutOfBoundsException e) + { + throw new PersonalException("Array-Fehler bei setAllFields(): " + + e.getMessage()); + } + catch(NumberFormatException e) + { + throw new PersonalException("Zahlenumwandlungs-Fehler (wochenStunden oder fixum) bei setAllFields(): " + + e.getMessage()); + } + } public float berechneStundensatz() throws PersonalException { diff --git a/src/model/Freelancer.java b/src/model/Freelancer.java index 0129a36..7df0c68 100644 --- a/src/model/Freelancer.java +++ b/src/model/Freelancer.java @@ -1,150 +1,163 @@ package model; -// 2022-04-01 4BAIF +import java.time.Year; + +// 2022-04-05 4BAIF // umgestellt auf Exception-Handling // mit serialVersionUID fuer Serialisierung // mit toStringCsv() +// mit Freelancer (String[] zeilenTeile) -import java.time.Year; -public class Freelancer extends Mitarbeiter implements PraemieBerechenbar, GehaltBerechenbar -{ +public class Freelancer extends Mitarbeiter implements PraemieBerechenbar, GehaltBerechenbar { private static final long serialVersionUID = 2022_03_22__13_15L; - private int stunden; - private float stundenSatz; - //private Year eintrJahr; // SO NICHT!!! + private int stunden; + private float stundenSatz; + // private Year eintrJahr; // SO NICHT!!! - public Freelancer(float stundenSatz, int stunden) throws PersonalException - { - super(); // ruft den parameterlosen/Default-Konstruktor der Superklasse Mitarbeiter auf - setStundenSatz(stundenSatz); - setStunden(stunden); - } - - public Freelancer(String name, char gesch, Year gebJahr, Year eintrJahr, float stundenSatz, int stunden) throws PersonalException - { - // setName(name); // so nicht! - // setGesch(gesch); // so nicht! - // .... - super(name, gesch, gebJahr, eintrJahr); // Aufruf des. K. der Superklasse - setStundenSatz(stundenSatz); - setStunden(stunden); - } - - public Freelancer (String[] zeilenTeile) throws PersonalException - { - super(zeilenTeile); - // Freelancer;Anna;w;1976;2002;"10";"100.0" - // [5] [6] im String-Array zeilenTeile - // Achtung: ArrayIndexOutOfBoundsException - // beim Parsen: NumberFormatException - try - { - setStunden( Integer.parseInt(zeilenTeile[5].trim()) ); // int - setStundenSatz( Float.parseFloat(zeilenTeile[6].trim()) ); // float - } - catch(ArrayIndexOutOfBoundsException e) - { - throw new PersonalException("Array-Fehler bei Freelancer(zeilenTeile): " - + e.getMessage()); - } - catch(NumberFormatException e) - { - throw new PersonalException("Zahlenumwandlungs-Fehler (gebJahr oder eintrJahr) bei Freelancer(zeilenTeile): " - + e.getMessage()); - } - } + public Freelancer(float stundenSatz, int stunden) throws PersonalException { + super(); // ruft den parameterlosen/Default-Konstruktor der Superklasse Mitarbeiter auf + setStundenSatz(stundenSatz); + setStunden(stunden); + } - public int getStunden() - { - return stunden; - } + public Freelancer(String name, char gesch, Year gebJahr, Year eintrJahr, float stundenSatz, int stunden) + throws PersonalException { + // setName(name); // so nicht! + // setGesch(gesch); // so nicht! + // .... + super(name, gesch, gebJahr, eintrJahr); // Aufruf des. K. der Superklasse + setStundenSatz(stundenSatz); + setStunden(stunden); + } - public float getStundenSatz() - { - return stundenSatz; - } + public Freelancer(String[] zeilenTeile) throws PersonalException { + super(zeilenTeile); + // Freelancer;Anna;w;1976;2002;"10";"100.0" + // [5] [6] im String-Array zeilenTeile + // Achtung: ArrayIndexOutOfBoundsException + // beim Parsen: NumberFormatException + try { + setStunden(Integer.parseInt(zeilenTeile[5].trim())); // int + setStundenSatz(Float.parseFloat(zeilenTeile[6].trim())); // float + } catch (ArrayIndexOutOfBoundsException e) { + throw new PersonalException("Array-Fehler bei Freelancer(zeilenTeile): " + e.getMessage()); + } catch (NumberFormatException e) { + throw new PersonalException( + "Zahlenumwandlungs-Fehler (gebJahr oder eintrJahr) bei Freelancer(zeilenTeile): " + e.getMessage()); + } + } - public void setStunden(int stunden) throws PersonalException - { - if (stunden > 0) - this.stunden = stunden; - else - throw new PersonalException("Fehler bei setStunden(): stunden sind 0 oder kleiner (" + stunden + ")"); - } + public int getStunden() { + return stunden; + } - public void setStundenSatz(float stundenSatz) throws PersonalException - { - if (stundenSatz > 0f) - this.stundenSatz = stundenSatz; - else - throw new PersonalException("Fehler bei setStundenSatz(): stundenSatz ist 0.0 oder kleiner (" + stundenSatz + ")"); - } - - // so NICHT!!! - // public void setEintrJahr(Year eintrJahr) - // { - // if (eintrJahr != null) - // if (gebJahr != null) - // { - // int aktJahr = Year.now().getValue(); - // if (eintrJahr.getValue() >= gebJahr.getValue()+15) - // if (eintrJahr.getValue() <= aktJahr ) - // this.eintrJahr = eintrJahr; - // else - // System.out.println("Falscher Parameterwert fuer setEintrJahr("+eintrJahr+") !!!"); - // else - // System.out.println("Fehler bei setEintrJahr("+eintrJahr+") -> Person ist zu jung ("+berechneAlter()+")!!!"); - // } - // else - // System.out.println("null-Referenz bei gebJahr -> eintrJahr kann nicht geprueft werden !!!"); - // else - // System.out.println("null-Referenz fuer setEintrJahr(Year eintrJahr) !!!"); - // } - - public float berechneGehalt() - { - return stundenSatz*stunden; - } + public float getStundenSatz() { + return stundenSatz; + } - public float berechnePraemie() // FUE Refactoring mit Verwendung von switch-case - { - float praemie = 0f; - - if (berechneDienstalter() == 15) - praemie = berechneGehalt(); // 1x Gehalt als Praemie - else - if (berechneDienstalter() == 20) - praemie = berechneGehalt()*2; // 2x Gehalt als Praemie - - return praemie; - } + public void setStunden(int stunden) throws PersonalException { + if (stunden > 0) + this.stunden = stunden; + else + throw new PersonalException("Fehler bei setStunden(): stunden sind 0 oder kleiner (" + stunden + ")"); + } - public String infoBerechnungPraemie() - { - return "Fuer 15 Jahre Mitarbeit bei einem Personalbuero erhaelt der Freelancer ein \"Gehalt\", fuer 20 Jahre zwei \"Gehaelter\"\" als Praemie."; - } - - // ---------------------------- toString / print ---------------------------- - - public String toStringCsv() - { - char sep = ';'; - - return super.toStringCsv()+sep+stunden+sep+stundenSatz; - } - - public String toString() - { - return new StringBuffer().append("Freelancer "). - append(super.toString()). // ohne super. -> StackOverflowError -> rekursiver Methodenaufruf - append(" Stunden: "). - append(stunden).append(" Stundensatz: "). - append(stundenSatz). - append(" Praemie: ").append(berechnePraemie()).toString(); - } + public void setStundenSatz(float stundenSatz) throws PersonalException { + if (stundenSatz > 0f) + this.stundenSatz = stundenSatz; + else + throw new PersonalException( + "Fehler bei setStundenSatz(): stundenSatz ist 0.0 oder kleiner (" + stundenSatz + ")"); + } + + // so NICHT!!! + // public void setEintrJahr(Year eintrJahr) + // { + // if (eintrJahr != null) + // if (gebJahr != null) + // { + // int aktJahr = Year.now().getValue(); + // if (eintrJahr.getValue() >= gebJahr.getValue()+15) + // if (eintrJahr.getValue() <= aktJahr ) + // this.eintrJahr = eintrJahr; + // else + // System.out.println("Falscher Parameterwert fuer setEintrJahr("+eintrJahr+") + // !!!"); + // else + // System.out.println("Fehler bei setEintrJahr("+eintrJahr+") -> Person ist zu + // jung ("+berechneAlter()+")!!!"); + // } + // else + // System.out.println("null-Referenz bei gebJahr -> eintrJahr kann nicht + // geprueft werden !!!"); + // else + // System.out.println("null-Referenz fuer setEintrJahr(Year eintrJahr) !!!"); + // } + + public float berechneGehalt() { + return stundenSatz * stunden; + } + + public float berechnePraemie() // FUE Refactoring mit Verwendung von switch-case + { + float praemie = 0f; + + if (berechneDienstalter() == 15) + praemie = berechneGehalt(); // 1x Gehalt als Praemie + else if (berechneDienstalter() == 20) + praemie = berechneGehalt() * 2; // 2x Gehalt als Praemie + + return praemie; + } + + public String infoBerechnungPraemie() { + return "Fuer 15 Jahre Mitarbeit bei einem Personalbuero erhaelt der Freelancer ein \"Gehalt\", fuer 20 Jahre zwei \"Gehaelter\"\" als Praemie."; + } + + // ----------------------------- equals / hashCode + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + Freelancer other = (Freelancer) obj; + if (stunden != other.stunden) + return false; + if (Float.floatToIntBits(stundenSatz) != Float.floatToIntBits(other.stundenSatz)) + return false; + return true; + } + + // ---------------------------- toString / print ---------------------------- + + public String toStringCsv() { + char sep = ';'; + + return super.toStringCsv() + sep + stunden + sep + stundenSatz; + } + + public String toString() { + return new StringBuffer().append("Freelancer ").append(super.toString()). // ohne super. -> StackOverflowError + // -> rekursiver Methodenaufruf + append(" Stunden: ").append(stunden).append(" Stundensatz: ").append(stundenSatz).append(" Praemie: ") + .append(berechnePraemie()).toString(); + } + + public void print() { + System.out.println(this); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + stunden; + result = prime * result + Float.floatToIntBits(stundenSatz); + return result; + } - public void print() - { - System.out.println(this); - } } diff --git a/src/model/Mitarbeiter.java b/src/model/Mitarbeiter.java index 5af6b84..23c882f 100644 --- a/src/model/Mitarbeiter.java +++ b/src/model/Mitarbeiter.java @@ -1,10 +1,13 @@ package model; import java.io.Serializable; +import java.time.DateTimeException; import java.time.Year; import java.util.Comparator; +import java.util.Objects; + +//2022-04-05 4BAIF -//2022-03-31 4BAIF //Klasse abstract //Methode berechneGehalt() abstract //2022-01-26: Debugging toString() - mit ?-Operator gefixt @@ -12,219 +15,199 @@ import java.util.Comparator; //Umstellung auf EH -// neuer Konstruktor fuer importMitarbeiter -// Entwicklungsstand +// neuer Konstruktor Mitarbeiter(String[] zeilenTeile) fuer importMitarbeiter +// setAllFields(String [] zeilenTeile) -public abstract class Mitarbeiter implements Comparable , Serializable +public abstract class Mitarbeiter implements Comparable, Serializable //public class Mitarbeiter implements Comparable // zum Testen { private static final long serialVersionUID = 2022_03_22__13_15L; private String name; - private Year gebJahr, eintrJahr; - private char gesch; + private Year gebJahr, eintrJahr; + private char gesch; - public Mitarbeiter() throws PersonalException // zum Testen - { - setName("Anna"); - setGesch('w'); - setGebJahr(Year.of(2001)); - setEintrJahr(Year.now()); - } + public Mitarbeiter() throws PersonalException // zum Testen + { + setName("Anna"); + setGesch('w'); + setGebJahr(Year.of(2001)); + setEintrJahr(Year.now()); + } - public Mitarbeiter(String name, char gesch, Year gebJahr, Year eintrJahr) throws PersonalException - { - setName(name); - setGesch(gesch); - setGebJahr(gebJahr); - setEintrJahr(eintrJahr); - } - - public Mitarbeiter(String[] zeilenTeile) throws PersonalException - { - if (zeilenTeile != null) - { + public Mitarbeiter(String name, char gesch, Year gebJahr, Year eintrJahr) throws PersonalException { + setName(name); + setGesch(gesch); + setGebJahr(gebJahr); + setEintrJahr(eintrJahr); + } + + public Mitarbeiter(String[] zeilenTeile) throws PersonalException { + if (zeilenTeile != null) { // setName(); // setGesch(); // setEintrJahr(); // setGebJahr(); - - setAllFields(zeilenTeile); - } - else - throw new PersonalException("Fehler bei Mitarbeiter(String[]): null-Referenz erhalten"); - } - //------------------------------------ getter ------------------------ - public String getName() - { - return name; - } + setAllFields(zeilenTeile); + } else + throw new PersonalException("Fehler bei Mitarbeiter(String[]): null-Referenz erhalten"); + } - public char getGesch() - { - return gesch; - } + // ------------------------------------ getter ------------------------ + public String getName() { + return name; + } - public Year getGebJahr() - { - return gebJahr; - } + public char getGesch() { + return gesch; + } - public Year getEintrJahr() - { - return eintrJahr; - } - //------------------------------------ setter ------------------------ - - public void setName(String name) throws PersonalException - { - if (name != null) - if (name.length() >= 2) - this.name = name; - else - throw new PersonalException("Falscher Parameterwert fuer setName("+name+") !!!"); - else - throw new PersonalException("null-Referenz fuer setName(String name) !!!"); - } + public Year getGebJahr() { + return gebJahr; + } - public void setGesch(char gesch) throws PersonalException - { - if (gesch == 'm' || gesch == 'M' || gesch == 'w' || gesch == 'W' || gesch == 'x' || gesch == 'X' ) - this.gesch = Character.toLowerCase(gesch); // Character ist "Wrapper"-Klasse von char - else - throw new PersonalException("Falscher Parameterwert fuer setGesch(" + gesch + ") !!!"); - } + public Year getEintrJahr() { + return eintrJahr; + } + // ------------------------------------ setter ------------------------ - public void setGebJahr(Year gebJahr) throws PersonalException - { - //int aktJahr = Year.now().getValue(); - Year aktYear = Year.now(); - if (gebJahr != null) - // if (gebJahr.getValue() >= aktJahr-100 && gebJahr.getValue() <= aktJahr ) - if ( !gebJahr.isBefore(aktYear.minusYears(100)) && !gebJahr.isAfter(aktYear) ) - this.gebJahr = gebJahr; - else - throw new PersonalException("Falscher Parameterwert fuer setGebJahr("+gebJahr+") !!!"); - else - throw new PersonalException("null-Referenz fuer setGebJahr(Year gebJahr) !!!"); - } + public void setName(String name) throws PersonalException { + if (name != null) + if (name.length() >= 2) + this.name = name; + else + throw new PersonalException("Falscher Parameterwert fuer setName(" + name + ") !!!"); + else + throw new PersonalException("null-Referenz fuer setName(String name) !!!"); + } - public void setEintrJahr(Year eintrJahr) throws PersonalException - { - if (eintrJahr != null) - if (gebJahr != null) - { - int aktJahr = Year.now().getValue(); - if (eintrJahr.getValue() >= gebJahr.getValue()+15) - if (eintrJahr.getValue() <= aktJahr ) - this.eintrJahr = eintrJahr; - else - throw new PersonalException("Falscher Parameterwert fuer setEintrJahr("+eintrJahr+") !!!"); - else - throw new PersonalException("Fehler bei setEintrJahr("+eintrJahr+") -> Person ist zu jung ("+berechneAlter()+")!!!"); - } - else - throw new PersonalException("null-Referenz bei gebJahr -> eintrJahr kann nicht geprueft werden !!!"); - else - throw new PersonalException("null-Referenz fuer setEintrJahr(Year eintrJahr) !!!"); - } - - // Entwicklungsstand TODO - private void setAllFields(String[] zeilenTeile) throws PersonalException { - - // beim Arbeiten mit Array kann es eine - // ArrayIndexOutOfBoundsException geben - try { - //Angestellter;Alfred; m; 1977; 2022 - // [0] [1] [2] [3] [4] im Array zeilenTeile - setName(zeilenTeile[1].trim()); // trim(): whitespaces "vorne und hinten" entfernen - setGesch(zeilenTeile[2].trim().charAt(0)); // z.B. "m" -> 'm' - // Integer.parseInt(String) - // throws NumberFormatException bei Integer.parseInt - setGebJahr( Year.of(Integer.parseInt(zeilenTeile[3].trim())) ); // "1977" - // throws NumberFormatException bei Integer.parseInt - setEintrJahr(Year.of(Integer.parseInt(zeilenTeile[4].trim()))); // 2022 - } - catch(ArrayIndexOutOfBoundsException e) - { - throw new PersonalException("Array-Fehler bei setAllFields(): " - + e.getMessage()); - } - catch (StringIndexOutOfBoundsException e) - { - throw new PersonalException("Zeichenumwandlungsfehler-Fehler (gesch) bei setAllFields(): " - + e.getMessage()); - } - catch(NumberFormatException e) - { - throw new PersonalException("Zahlenumwandlungs-Fehler (gebJahr oder eintrJahr) bei setAllFields(): " - + e.getMessage()); - } - } - //-------------------------------------- weitere ----------------------- - public int berechneAlter() - { - // return 2021 - gebJahr; // ganz schlecht... + public void setGesch(char gesch) throws PersonalException { + if (gesch == 'm' || gesch == 'M' || gesch == 'w' || gesch == 'W' || gesch == 'x' || gesch == 'X') + this.gesch = Character.toLowerCase(gesch); // Character ist "Wrapper"-Klasse von char + else + throw new PersonalException("Falscher Parameterwert fuer setGesch(" + gesch + ") !!!"); + } - // Bessere Loesung in Einzelschritten: - // Year datum = Year.now(); - // int aktJahr = datum.getValue(); - // int alter = aktJahr - gebJahr; - // return alter; + public void setGebJahr(Year gebJahr) throws PersonalException { + // int aktJahr = Year.now().getValue(); + Year aktYear = Year.now(); + if (gebJahr != null) + // if (gebJahr.getValue() >= aktJahr-100 && gebJahr.getValue() <= aktJahr ) + if (!gebJahr.isBefore(aktYear.minusYears(100)) && !gebJahr.isAfter(aktYear)) + this.gebJahr = gebJahr; + else + throw new PersonalException("Falscher Parameterwert fuer setGebJahr(" + gebJahr + ") !!!"); + else + throw new PersonalException("null-Referenz fuer setGebJahr(Year gebJahr) !!!"); + } - // Bessere Loesung in einem Schritt: - return (gebJahr != null?Year.now().getValue() - gebJahr.getValue():-99); // Fehlercode - } + public void setEintrJahr(Year eintrJahr) throws PersonalException { + if (eintrJahr != null) + if (gebJahr != null) { + int aktJahr = Year.now().getValue(); + if (eintrJahr.getValue() >= gebJahr.getValue() + 15) + if (eintrJahr.getValue() <= aktJahr) + this.eintrJahr = eintrJahr; + else + throw new PersonalException("Falscher Parameterwert fuer setEintrJahr(" + eintrJahr + ") !!!"); + else + throw new PersonalException("Fehler bei setEintrJahr(" + eintrJahr + ") -> Person ist zu jung (" + + berechneAlter() + ")!!!"); + } else + throw new PersonalException("null-Referenz bei gebJahr -> eintrJahr kann nicht geprueft werden !!!"); + else + throw new PersonalException("null-Referenz fuer setEintrJahr(Year eintrJahr) !!!"); + } - public int berechneDienstalter() - { - return (eintrJahr != null?Year.now().getValue() - eintrJahr.getValue():-99); // Fehlercode - } + private void setAllFields(String[] zeilenTeile) throws PersonalException { - // public float berechneGehalt() - // { - // return 1500f + 50f*berechneDienstalter(); - // } + // beim Arbeiten mit Array kann es eine + // ArrayIndexOutOfBoundsException geben + try { + // Angestellter;Alfred; m; 1977; 2022 + // [0] [1] [2] [3] [4] im Array zeilenTeile + setName(zeilenTeile[1].trim()); // trim(): whitespaces "vorne und hinten" entfernen + setGesch(zeilenTeile[2].trim().charAt(0)); // z.B. "m" -> 'm' + // Integer.parseInt(String) + // throws NumberFormatException bei Integer.parseInt + setGebJahr(Year.of(Integer.parseInt(zeilenTeile[3].trim()))); // "1977" + // throws NumberFormatException bei Integer.parseInt + setEintrJahr(Year.of(Integer.parseInt(zeilenTeile[4].trim()))); // "2022" + } catch (ArrayIndexOutOfBoundsException e) { + throw new PersonalException("Array-Fehler bei setAllFields(): " + e.getMessage()); + } catch (StringIndexOutOfBoundsException e) { + throw new PersonalException( + "Zeichenumwandlungsfehler-Fehler (gesch) bei setAllFields(): " + e.getMessage()); + } catch (NumberFormatException e) { + throw new PersonalException( + "Zahlenumwandlungs-Fehler (gebJahr oder eintrJahr) bei setAllFields(): " + e.getMessage()); + } catch (DateTimeException e) // wird von Year.of() moeglicherweise "geworfen" + { + throw new PersonalException( + "Jahreszahlumwandlungs-Fehler (gebJahr oder eintrJahr) bei setAllFields(): " + e.getMessage()); + } + } + + // -------------------------------------- weitere ----------------------- + public int berechneAlter() { + // return 2021 - gebJahr; // ganz schlecht... + + // Bessere Loesung in Einzelschritten: + // Year datum = Year.now(); + // int aktJahr = datum.getValue(); + // int alter = aktJahr - gebJahr; + // return alter; + + // Bessere Loesung in einem Schritt: + return (gebJahr != null ? Year.now().getValue() - gebJahr.getValue() : -99); // Fehlercode + } + + public int berechneDienstalter() { + return (eintrJahr != null ? Year.now().getValue() - eintrJahr.getValue() : -99); // Fehlercode + } + + // public float berechneGehalt() + // { + // return 1500f + 50f*berechneDienstalter(); + // } // public float berechneGehalt() // zum UMSTELLEN und TESTEN // { // return 0f; // } - - public abstract float berechneGehalt(); // alle Subklassen - // MUESSEN diese Methode implementieren - // Ausnahme: diese Subklasse ist auch abstrakt - - // public abstract int berechneUrlaubsanspruch() // Beispiel fuer einen - // Anwendungsfall einer abstrakten Methode - // ; - - // --------------------------------- compareTo ----------------------------- + + public abstract float berechneGehalt(); // alle Subklassen + // MUESSEN diese Methode implementieren + // Ausnahme: diese Subklasse ist auch abstrakt + + // public abstract int berechneUrlaubsanspruch() // Beispiel fuer einen + // Anwendungsfall einer abstrakten Methode + // ; + + // --------------------------------- compareTo ----------------------------- @Override public int compareTo(Mitarbeiter o) { // "natuerliche" Reihenfolge von Gehalt - if (o != null) - { + if (o != null) { if (berechneGehalt() > o.berechneGehalt()) return 1; + else if (berechneGehalt() < o.berechneGehalt()) + return -1; else - if (berechneGehalt() < o.berechneGehalt()) - return -1; - else - return 0; - } - else // Annahme bis zum ExceptionHandling, dann NullPointerException + return 0; + } else // Annahme bis zum ExceptionHandling, dann NullPointerException return 1; } - - // ----------------------------------- innere Klasse -------------------------------- - + + // ----------------------------------- innere Klasse + // -------------------------------- + public static class AlterComparator implements Comparator { @Override public int compare(Mitarbeiter o1, Mitarbeiter o2) { - + if (o1 != null && o2 != null) if (o1.berechneAlter() > o2.berechneAlter()) return 1; @@ -235,53 +218,71 @@ public abstract class Mitarbeiter implements Comparable , Serializa else // o1 == null || o2 == null return 1; } - } - - // ------------------------------------ toString() / print -------------------------------------- - public String toString() - { - String geschlecht; - switch(gesch) - { - case 'm': - case 'M': geschlecht = "maennlich"; break; - case 'w': - case 'W': geschlecht = "weiblich"; break; - case 'x': - case 'X': geschlecht = "divers"; break; - default : geschlecht = "unbekannt"; + } - } - return "Name: " + name+ - ", Gesch.: " + geschlecht+ - ", Geb.Jahr: " + (gebJahr != null?gebJahr.getValue():"keines vorhanden")+ - ", Alter: " + berechneAlter()+ - ", Eintr.Jahr: " + (eintrJahr != null?eintrJahr.getValue():"keines vorhanden")+ - ", Dienstalter: "+ berechneDienstalter() + - ", Gehalt: " + berechneGehalt(); - } - - public void print() - { - System.out.println(this); //System.out.println(toString()) - } - - public String toStringCsv() - { - char sep = ';'; // "Trennzeichen" zwischen den Attribut-Werten - - StringBuilder sb = new StringBuilder(); + // ------------------------------------- equals / hashCode + + @Override + public int hashCode() { + return Objects.hash(eintrJahr, gebJahr, gesch, name); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Mitarbeiter other = (Mitarbeiter) obj; + return Objects.equals(eintrJahr, other.eintrJahr) && Objects.equals(gebJahr, other.gebJahr) + && gesch == other.gesch && Objects.equals(name, other.name); + } + + // ------------------------------------ toString() / print + // -------------------------------------- + public String toString() { + String geschlecht; + switch (gesch) { + case 'm': + case 'M': + geschlecht = "maennlich"; + break; + case 'w': + case 'W': + geschlecht = "weiblich"; + break; + case 'x': + case 'X': + geschlecht = "divers"; + break; + default: + geschlecht = "unbekannt"; + + } + return "Name: " + name + ", Gesch.: " + geschlecht + ", Geb.Jahr: " + + (gebJahr != null ? gebJahr.getValue() : "keines vorhanden") + ", Alter: " + berechneAlter() + + ", Eintr.Jahr: " + (eintrJahr != null ? eintrJahr.getValue() : "keines vorhanden") + ", Dienstalter: " + + berechneDienstalter() + ", Gehalt: " + berechneGehalt(); + } + + public void print() { + System.out.println(this); // System.out.println(toString()) + } + + public String toStringCsv() { + char sep = ';'; // "Trennzeichen" zwischen den Attribut-Werten + + StringBuilder sb = new StringBuilder(); + + sb.append(getClass().getSimpleName()).append(sep); // Typ bzw. Klassenbezeichnung + sb.append(name).append(sep); // name + sb.append(gesch).append(sep); // gesch + sb.append(gebJahr).append(sep); // gebJahr + sb.append(eintrJahr); // .append(sep); // eintrJahr + + return (sb.toString()); + } - sb.append(getClass().getSimpleName()).append(sep); // Typ bzw. Klassenbezeichnung - sb.append(name).append(sep); // name - sb.append(gesch).append(sep); // gesch - sb.append(gebJahr).append(sep); // gebJahr - sb.append(eintrJahr); // .append(sep); // eintrJahr - - return (sb.toString()); - } } - - - - diff --git a/src/model/Personalbuero.java b/src/model/Personalbuero.java index cded53e..4bd26fa 100644 --- a/src/model/Personalbuero.java +++ b/src/model/Personalbuero.java @@ -15,7 +15,7 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; -// 2022-04-01 4BAIF +// 2022-04-05 4BAIF // Umgestellt auf ArrayList // mit public float berechneDurchnittsalter() @@ -51,7 +51,10 @@ import java.util.List; // 2022-03-29 exportMitarbeiterCsv -// 2022-04-01 importMitarbeiterCsc Vorbereitung +// 2022-04-01 importMitarbeiterCsc() fuer Angestellte +// 2022-04-05 importMitarbeiterCsc fuer Freelancer und Arzt + +// 2022-01-07 doppeltes aufnehmen verhindern, equals, hashcode (Old and new) public class Personalbuero { private ArrayList mitarbeiter; // eine ArrayList ist "getypt" @@ -77,7 +80,11 @@ public class Personalbuero { // if (anzahl < mitarbeiter.length) // { // mitarbeiter[anzahl] = ma; - return mitarbeiter.add(ma); // liefert immer true + if (!mitarbeiter.contains(ma)) { + return mitarbeiter.add(ma); // liefert immer true + } else { + throw new PersonalException("Fehler bei aufnehmen(): Mitarbeiter/in schon vorhanden"); + } // anzahl ++; // return true; // } @@ -317,9 +324,9 @@ public class Personalbuero { public void saveMitarbeiter() throws PersonalException { String fSep = System.getProperty("file.separator"); - // String strPfadName = "c:\\scratch\\mitarbeiter.ser"; - String strPfadName = "c:" + fSep + "scratch" + fSep + "mitarbeiter.ser"; - + //String strPfadName = "c:\\scratch\\mitarbeiter.ser"; + String strPfadName = "c:"+ fSep + "scratch" + fSep + "mitarbeiter.ser"; + try ( // try with ressources -> close() erfolgt "automatisch" ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(strPfadName));) { // hier erfolgt das "Speichern" @@ -333,24 +340,30 @@ public class Personalbuero { } // loadMitarbeiter Variante 2 OHNE suppressWarning -> empfohlen - public void loadMitarbeiter() throws PersonalException { - + public void loadMitarbeiter() throws PersonalException + { + String fSep = System.getProperty("file.separator"); - // String strPfadName = "c:\\scratch\\mitarbeiter.ser"; - String strPfadName = "c:" + fSep + "scratch" + fSep + "mitarbeiter.ser"; - - try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(strPfadName))) { - - List tempMitarbeiter = (List) ois.readObject(); + //String strPfadName = "c:\\scratch\\mitarbeiter.ser"; + String strPfadName = "c:"+ fSep + "scratch" + fSep + "mitarbeiter.ser"; + + try ( ObjectInputStream ois = + new ObjectInputStream(new FileInputStream(strPfadName))) + { + + List tempMitarbeiter = (List ) ois.readObject(); + mitarbeiter.clear(); // ersetzen und NICHT hinzufuegen - - for (Object o : tempMitarbeiter) { - if (o instanceof Mitarbeiter) { - aufnehmen((Mitarbeiter) o); + + for (Object o : tempMitarbeiter) + { + if (o instanceof Mitarbeiter) + { + aufnehmen((Mitarbeiter)o); } } - + } catch (FileNotFoundException e) { throw new PersonalException("Datei-Fehler bei loadMitarbeiter(): " + e.getMessage()); } catch (IOException e) { @@ -359,7 +372,7 @@ public class Personalbuero { throw new PersonalException("Klassen-Fehler bei loadMitarbeiter(): " + e.getMessage()); } } - + // Variante1: es geht "typsicherer" -> Variante2 // @SuppressWarnings("unchecked") // funktionsfaehige allerdings nicht empfohlene Variante1 // public void loadMitarbeiter() throws PersonalException @@ -380,72 +393,94 @@ public class Personalbuero { // throw new PersonalException("Klassen-Fehler bei loadMitarbeiter(): " + e.getMessage()); // } // } - - public void exportMitarbeiter() throws PersonalException { - + + public void exportMitarbeiter() throws PersonalException + { + String fSep = System.getProperty("file.separator"); - String strPfadName = "c:" + fSep + "scratch" + fSep + "mitarbeiter.txt"; + String strPfadName = "c:"+ fSep + "scratch" + fSep + "mitarbeiter.txt"; String nLn = System.getProperty("line.separator"); - - try (BufferedWriter bw = new BufferedWriter(new FileWriter(strPfadName))) { - for (Mitarbeiter mit : mitarbeiter) { - // bw.write(mit.toString() + "\n"); + + try ( BufferedWriter bw = new BufferedWriter(new FileWriter(strPfadName))) + { + for (Mitarbeiter mit : mitarbeiter) + { + //bw.write(mit.toString() + "\n"); bw.write(mit.toString() + nLn); // mit Line-Separator } - + } catch (IOException e) { - throw new PersonalException("Eingabe/Ausgabe-Fehler bei exportMitarbeiter()" + e.getMessage()); + throw new PersonalException("Eingabe/Ausgabe-Fehler bei exportMitarbeiter()" + + e.getMessage()); } } - - public void exportMitarbeiterCsv() throws PersonalException { + + public void exportMitarbeiterCsv() throws PersonalException + { String fSep = System.getProperty("file.separator"); - String strPfadName = "c:" + fSep + "scratch" + fSep + "mitarbeiter.csv"; + String strPfadName = "c:"+ fSep + "scratch" + fSep + "mitarbeiter.csv"; String nLn = System.getProperty("line.separator"); - - try (BufferedWriter bw = new BufferedWriter(new FileWriter(strPfadName))) { + + try (BufferedWriter bw = new BufferedWriter(new FileWriter(strPfadName))) + { StringBuilder sb = new StringBuilder(100000); for (Mitarbeiter mit : mitarbeiter) sb.append(mit.toStringCsv()).append(nLn); // .append("\n"); bw.write(sb.toString()); } catch (IOException e) { - throw new PersonalException("Eingabe/Ausgabe-Fehler bei exportMitarbeiterCsv()" + e.getMessage()); + throw new PersonalException("Eingabe/Ausgabe-Fehler bei exportMitarbeiterCsv()" + + e.getMessage()); } } - - public void importMitarbeiterCsv() throws PersonalException // TODO + + // NEU 2022-04-06 mit Freelancer und Arzt + public void importMitarbeiterCsv() throws PersonalException { - String fSep = System.getProperty("file.separator"); - String strPfadName = "c:" + fSep + "scratch" + fSep + "mitarbeiter.csv"; - - try (BufferedReader br = new BufferedReader(new FileReader(strPfadName))) { + String fSep = System.getProperty("file.separator"); + String strPfadName = "c:"+fSep+"scratch"+fSep+"mitarbeiter.csv"; + + try(BufferedReader br = new BufferedReader(new FileReader(strPfadName))) + { String zeile; String[] zeilenTeile; String sep = ";"; // erwartetes Trennzeichen in der csv-Datei - + // Muster: "Vorauslesen" zeile = br.readLine(); // wenn keine Zeile gefunden, dann return null - - while (zeile != null) { + + while(zeile != null) + { zeilenTeile = zeile.trim().split(sep); - + // Welcher Konstruktor wird aufgerufen? // Wie ermitteln wir den Mitarbeiter-Typ? - - if (zeile.contains("Angestellter")) { + + if (zeile.contains("Angestellter")) + { aufnehmen(new Angestellter(zeilenTeile)); - } else - ; // if ((zeile.contains("Freelancer")) - // else - // if ((zeile.contains("Arzt")) - // else unbekannter Mitarbeiter-Typ + } + else + if (zeile.contains("Freelancer")) + { + aufnehmen(new Freelancer(zeilenTeile)); + } + else + if (zeile.contains("Arzt")) + { + aufnehmen(new Arzt(zeilenTeile)); + } + else + ; // hier Mitarbeiter-Typ(en) + // zukuenftiger Erweiterungen ergaenzen zeile = br.readLine(); } - + } catch (FileNotFoundException e) { - throw new PersonalException("Datei-Fehler bei importMitarbeiterCsv(): " + e.getMessage()); + throw new PersonalException("Datei-Fehler bei importMitarbeiterCsv(): " + + e.getMessage()); } catch (IOException e) { - throw new PersonalException("Eingabe/Ausgabe-Fehler bei importMitarbeiterCsv(): " + e.getMessage()); + throw new PersonalException("Eingabe/Ausgabe-Fehler bei importMitarbeiterCsv(): " + + e.getMessage()); } } @@ -477,7 +512,7 @@ public class Personalbuero { sb.append("keine Mitarbeiter im Personalbuero"); return sb.toString(); } - + public void print() { System.out.println(this); } diff --git a/src/test/TestImport.java b/src/test/TestImport.java index 386ce56..d518ad2 100644 --- a/src/test/TestImport.java +++ b/src/test/TestImport.java @@ -6,7 +6,7 @@ import model.Freelancer; import model.PersonalException; import model.Personalbuero; -// 2022-04-01 +// 2022-04-05 public class TestImport { @@ -22,7 +22,8 @@ public class TestImport System.out.println(); // zeilenTeile-Konstruktoren testen - // TODO Freelancer + // TODO FUE Freelancer + // TODO FUE Arzt // pb.aufnehmen(new Angestellter(new String[] {})); // Array-Fehler: Index 1 out of bounds for length 0 // pb.aufnehmen(new Angestellter(new String[] {"", "", "", "",""})); // Fehler: falscher Parameterwert name @@ -34,14 +35,13 @@ public class TestImport System.out.println(pb); // Hans, Hannes System.out.println(); -// System.out.println("TODO: Personalbuero.importMitarbeiterCsv() ist noch zu implementieren!!!"); // TODO pb.importMitarbeiterCsv(); System.out.println(pb); // Hans, Hannes, Alfred, Anna, Wolfgang System.out.println(); try { Freelancer f2 = new Freelancer("Anna", 'w', Year.of(1976), Year.of(2002), 100f, 10); - pb.aufnehmen(f2); // Fehler schon vorhanden + pb.aufnehmen(f2); // Fehler schon vorhanden // TODO kein Fehler } catch (PersonalException e) { System.out.println("!!! Fehler bei TestImport !!!" +nLn+ e.getMessage()); @@ -52,13 +52,15 @@ public class TestImport System.out.println(); Angestellter a1 = new Angestellter("Alfred", 'm', Year.of(1977), Year.now()); - pb.aufnehmen(a1); // Fehler schon vorhanden + pb.aufnehmen(a1); // Fehler schon vorhanden // TODO kein Fehler + System.out.println(pb); // Hans, Hannes, Alfred, Anna, Wolfgang + System.out.println(); + } catch (PersonalException e) { System.out.println("!!! Fehler bei TestImport !!!" +nLn+ e.getMessage()); } - } } diff --git a/src/test/TestPersonalbueroMain.java b/src/test/TestPersonalbueroMain.java index c5d900a..45cba7b 100644 --- a/src/test/TestPersonalbueroMain.java +++ b/src/test/TestPersonalbueroMain.java @@ -34,7 +34,7 @@ public class TestPersonalbueroMain { testSaveMitarbeiter(); testLoadMitarbeiter(); - + testExportMitarbeiter(); } catch (Exception e) { @@ -47,7 +47,7 @@ public class TestPersonalbueroMain { private static void testExportMitarbeiter() { System.out.println("+++++++++++++++++++++++ testExportMitarbeiter +++++++++++++++++++++++++\n"); - + try { Personalbuero pb = new Personalbuero(); @@ -55,17 +55,17 @@ public class TestPersonalbueroMain { pb.aufnehmen(a1); Freelancer f2 = new Freelancer("Anna", 'w', Year.of(1976), Year.of(2002), 100f, 10); // 1000 pb.aufnehmen(f2); - - System.out.println(pb); // Alfred / Anna + + System.out.println(pb); // Alfred / Anna System.out.println(); - + pb.exportMitarbeiter(); System.out.println("Die Mitarbeiter wurden exportiert"); - + } catch (PersonalException e) { System.out.println(e.getMessage()); } - + } public static void testSaveMitarbeiter() {