doppeltes aufnehmen verhindert, equals, hashcode (Old and new)

This commit is contained in:
unknown 2022-04-07 14:07:14 +02:00
parent 47ddd17223
commit e6e59766b6
6 changed files with 510 additions and 429 deletions

View File

@ -5,20 +5,29 @@ import java.time.Year;
* Klasse Arzt * Klasse Arzt
* *
* @author (WES) * @author (WES)
* @version (2022-03-31) * @version (2022-04-05)
* *
* umgestellt auf Exception-Handling * umgestellt auf Exception-Handling
* mit freiwilliger Uebung toStringCsv() * mit freiwilliger Uebung toStringCsv()
* mit freiwilliger Uebung public Arzt (String[] zeilenTeile) * mit freiwilliger Uebung public Arzt (String[] zeilenTeile)
* mit public Arzt(String[] zeilenTeile)
* mit setAllFields(String[] zeilenTeile)
*/ */
public class Arzt extends Mitarbeiter implements GehaltBerechenbar 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 int wochenStunden;
private float fixum; private float fixum;
// FUE // FUE 2002-04-01
// public Arzt (String[] zeilenTeile) // TODO // 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 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 else
throw new PersonalException("Fehler bei setFixum(): Wert von fixum muss groesser 0.0 sein (" + fixum + ")"); 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 public float berechneStundensatz() throws PersonalException
{ {

View File

@ -1,150 +1,163 @@
package model; package model;
// 2022-04-01 4BAIF import java.time.Year;
// 2022-04-05 4BAIF
// umgestellt auf Exception-Handling // umgestellt auf Exception-Handling
// mit serialVersionUID fuer Serialisierung // mit serialVersionUID fuer Serialisierung
// mit toStringCsv() // 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 static final long serialVersionUID = 2022_03_22__13_15L;
private int stunden; private int stunden;
private float stundenSatz; private float stundenSatz;
//private Year eintrJahr; // SO NICHT!!! // private Year eintrJahr; // SO NICHT!!!
public Freelancer(float stundenSatz, int stunden) throws PersonalException public Freelancer(float stundenSatz, int stunden) throws PersonalException {
{ super(); // ruft den parameterlosen/Default-Konstruktor der Superklasse Mitarbeiter auf
super(); // ruft den parameterlosen/Default-Konstruktor der Superklasse Mitarbeiter auf setStundenSatz(stundenSatz);
setStundenSatz(stundenSatz); setStunden(stunden);
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 int getStunden() public Freelancer(String name, char gesch, Year gebJahr, Year eintrJahr, float stundenSatz, int stunden)
{ throws PersonalException {
return stunden; // 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() public Freelancer(String[] zeilenTeile) throws PersonalException {
{ super(zeilenTeile);
return stundenSatz; // 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 public int getStunden() {
{ return stunden;
if (stunden > 0) }
this.stunden = stunden;
else
throw new PersonalException("Fehler bei setStunden(): stunden sind 0 oder kleiner (" + stunden + ")");
}
public void setStundenSatz(float stundenSatz) throws PersonalException public float getStundenSatz() {
{ return stundenSatz;
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 public void setStunden(int stunden) throws PersonalException {
{ if (stunden > 0)
float praemie = 0f; this.stunden = stunden;
else
if (berechneDienstalter() == 15) throw new PersonalException("Fehler bei setStunden(): stunden sind 0 oder kleiner (" + stunden + ")");
praemie = berechneGehalt(); // 1x Gehalt als Praemie }
else
if (berechneDienstalter() == 20)
praemie = berechneGehalt()*2; // 2x Gehalt als Praemie
return praemie;
}
public String infoBerechnungPraemie() public void setStundenSatz(float stundenSatz) throws PersonalException {
{ if (stundenSatz > 0f)
return "Fuer 15 Jahre Mitarbeit bei einem Personalbuero erhaelt der Freelancer ein \"Gehalt\", fuer 20 Jahre zwei \"Gehaelter\"\" als Praemie."; this.stundenSatz = stundenSatz;
} else
throw new PersonalException(
// ---------------------------- toString / print ---------------------------- "Fehler bei setStundenSatz(): stundenSatz ist 0.0 oder kleiner (" + stundenSatz + ")");
}
public String toStringCsv()
{ // so NICHT!!!
char sep = ';'; // public void setEintrJahr(Year eintrJahr)
// {
return super.toStringCsv()+sep+stunden+sep+stundenSatz; // if (eintrJahr != null)
} // if (gebJahr != null)
// {
public String toString() // int aktJahr = Year.now().getValue();
{ // if (eintrJahr.getValue() >= gebJahr.getValue()+15)
return new StringBuffer().append("Freelancer "). // if (eintrJahr.getValue() <= aktJahr )
append(super.toString()). // ohne super. -> StackOverflowError -> rekursiver Methodenaufruf // this.eintrJahr = eintrJahr;
append(" Stunden: "). // else
append(stunden).append(" Stundensatz: "). // System.out.println("Falscher Parameterwert fuer setEintrJahr("+eintrJahr+")
append(stundenSatz). // !!!");
append(" Praemie: ").append(berechnePraemie()).toString(); // 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);
}
} }

View File

@ -1,10 +1,13 @@
package model; package model;
import java.io.Serializable; import java.io.Serializable;
import java.time.DateTimeException;
import java.time.Year; import java.time.Year;
import java.util.Comparator; import java.util.Comparator;
import java.util.Objects;
//2022-04-05 4BAIF
//2022-03-31 4BAIF
//Klasse abstract //Klasse abstract
//Methode berechneGehalt() abstract //Methode berechneGehalt() abstract
//2022-01-26: Debugging toString() - mit ?-Operator gefixt //2022-01-26: Debugging toString() - mit ?-Operator gefixt
@ -12,219 +15,199 @@ import java.util.Comparator;
//Umstellung auf EH //Umstellung auf EH
// neuer Konstruktor fuer importMitarbeiter // neuer Konstruktor Mitarbeiter(String[] zeilenTeile) fuer importMitarbeiter
// Entwicklungsstand // setAllFields(String [] zeilenTeile)
public abstract class Mitarbeiter implements Comparable <Mitarbeiter>, Serializable public abstract class Mitarbeiter implements Comparable<Mitarbeiter>, Serializable
//public class Mitarbeiter implements Comparable <Mitarbeiter> // zum Testen //public class Mitarbeiter implements Comparable <Mitarbeiter> // zum Testen
{ {
private static final long serialVersionUID = 2022_03_22__13_15L; private static final long serialVersionUID = 2022_03_22__13_15L;
private String name; private String name;
private Year gebJahr, eintrJahr; private Year gebJahr, eintrJahr;
private char gesch; private char gesch;
public Mitarbeiter() throws PersonalException // zum Testen public Mitarbeiter() throws PersonalException // zum Testen
{ {
setName("Anna"); setName("Anna");
setGesch('w'); setGesch('w');
setGebJahr(Year.of(2001)); setGebJahr(Year.of(2001));
setEintrJahr(Year.now()); setEintrJahr(Year.now());
} }
public Mitarbeiter(String name, char gesch, Year gebJahr, Year eintrJahr) throws PersonalException public Mitarbeiter(String name, char gesch, Year gebJahr, Year eintrJahr) throws PersonalException {
{ setName(name);
setName(name); setGesch(gesch);
setGesch(gesch); setGebJahr(gebJahr);
setGebJahr(gebJahr); setEintrJahr(eintrJahr);
setEintrJahr(eintrJahr); }
}
public Mitarbeiter(String[] zeilenTeile) throws PersonalException {
public Mitarbeiter(String[] zeilenTeile) throws PersonalException if (zeilenTeile != null) {
{
if (zeilenTeile != null)
{
// setName(); // setName();
// setGesch(); // setGesch();
// setEintrJahr(); // setEintrJahr();
// setGebJahr(); // setGebJahr();
setAllFields(zeilenTeile);
}
else
throw new PersonalException("Fehler bei Mitarbeiter(String[]): null-Referenz erhalten");
}
//------------------------------------ getter ------------------------ setAllFields(zeilenTeile);
public String getName() } else
{ throw new PersonalException("Fehler bei Mitarbeiter(String[]): null-Referenz erhalten");
return name; }
}
public char getGesch() // ------------------------------------ getter ------------------------
{ public String getName() {
return gesch; return name;
} }
public Year getGebJahr() public char getGesch() {
{ return gesch;
return gebJahr; }
}
public Year getEintrJahr() public Year getGebJahr() {
{ return gebJahr;
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 void setGesch(char gesch) throws PersonalException public Year getEintrJahr() {
{ return eintrJahr;
if (gesch == 'm' || gesch == 'M' || gesch == 'w' || gesch == 'W' || gesch == 'x' || gesch == 'X' ) }
this.gesch = Character.toLowerCase(gesch); // Character ist "Wrapper"-Klasse von char // ------------------------------------ setter ------------------------
else
throw new PersonalException("Falscher Parameterwert fuer setGesch(" + gesch + ") !!!");
}
public void setGebJahr(Year gebJahr) throws PersonalException public void setName(String name) throws PersonalException {
{ if (name != null)
//int aktJahr = Year.now().getValue(); if (name.length() >= 2)
Year aktYear = Year.now(); this.name = name;
if (gebJahr != null) else
// if (gebJahr.getValue() >= aktJahr-100 && gebJahr.getValue() <= aktJahr ) throw new PersonalException("Falscher Parameterwert fuer setName(" + name + ") !!!");
if ( !gebJahr.isBefore(aktYear.minusYears(100)) && !gebJahr.isAfter(aktYear) ) else
this.gebJahr = gebJahr; throw new PersonalException("null-Referenz fuer setName(String name) !!!");
else }
throw new PersonalException("Falscher Parameterwert fuer setGebJahr("+gebJahr+") !!!");
else
throw new PersonalException("null-Referenz fuer setGebJahr(Year gebJahr) !!!");
}
public void setEintrJahr(Year eintrJahr) throws PersonalException public void setGesch(char gesch) throws PersonalException {
{ if (gesch == 'm' || gesch == 'M' || gesch == 'w' || gesch == 'W' || gesch == 'x' || gesch == 'X')
if (eintrJahr != null) this.gesch = Character.toLowerCase(gesch); // Character ist "Wrapper"-Klasse von char
if (gebJahr != null) else
{ throw new PersonalException("Falscher Parameterwert fuer setGesch(" + gesch + ") !!!");
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...
// Bessere Loesung in Einzelschritten: public void setGebJahr(Year gebJahr) throws PersonalException {
// Year datum = Year.now(); // int aktJahr = Year.now().getValue();
// int aktJahr = datum.getValue(); Year aktYear = Year.now();
// int alter = aktJahr - gebJahr; if (gebJahr != null)
// return alter; // 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: public void setEintrJahr(Year eintrJahr) throws PersonalException {
return (gebJahr != null?Year.now().getValue() - gebJahr.getValue():-99); // Fehlercode 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() private void setAllFields(String[] zeilenTeile) throws PersonalException {
{
return (eintrJahr != null?Year.now().getValue() - eintrJahr.getValue():-99); // Fehlercode
}
// public float berechneGehalt() // beim Arbeiten mit Array kann es eine
// { // ArrayIndexOutOfBoundsException geben
// return 1500f + 50f*berechneDienstalter(); 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 // public float berechneGehalt() // zum UMSTELLEN und TESTEN
// { // {
// return 0f; // return 0f;
// } // }
public abstract float berechneGehalt(); // alle Subklassen public abstract float berechneGehalt(); // alle Subklassen
// MUESSEN diese Methode implementieren // MUESSEN diese Methode implementieren
// Ausnahme: diese Subklasse ist auch abstrakt // Ausnahme: diese Subklasse ist auch abstrakt
// public abstract int berechneUrlaubsanspruch() // Beispiel fuer einen // public abstract int berechneUrlaubsanspruch() // Beispiel fuer einen
// Anwendungsfall einer abstrakten Methode // Anwendungsfall einer abstrakten Methode
// ; // ;
// --------------------------------- compareTo ----------------------------- // --------------------------------- compareTo -----------------------------
@Override @Override
public int compareTo(Mitarbeiter o) { // "natuerliche" Reihenfolge von Gehalt public int compareTo(Mitarbeiter o) { // "natuerliche" Reihenfolge von Gehalt
if (o != null) if (o != null) {
{
if (berechneGehalt() > o.berechneGehalt()) if (berechneGehalt() > o.berechneGehalt())
return 1; return 1;
else if (berechneGehalt() < o.berechneGehalt())
return -1;
else else
if (berechneGehalt() < o.berechneGehalt()) return 0;
return -1; } else // Annahme bis zum ExceptionHandling, dann NullPointerException
else
return 0;
}
else // Annahme bis zum ExceptionHandling, dann NullPointerException
return 1; return 1;
} }
// ----------------------------------- innere Klasse -------------------------------- // ----------------------------------- innere Klasse
// --------------------------------
public static class AlterComparator implements Comparator<Mitarbeiter> { public static class AlterComparator implements Comparator<Mitarbeiter> {
@Override @Override
public int compare(Mitarbeiter o1, Mitarbeiter o2) { public int compare(Mitarbeiter o1, Mitarbeiter o2) {
if (o1 != null && o2 != null) if (o1 != null && o2 != null)
if (o1.berechneAlter() > o2.berechneAlter()) if (o1.berechneAlter() > o2.berechneAlter())
return 1; return 1;
@ -235,53 +218,71 @@ public abstract class Mitarbeiter implements Comparable <Mitarbeiter>, Serializa
else // o1 == null || o2 == null else // o1 == null || o2 == null
return 1; 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";
} // ------------------------------------- equals / hashCode
return "Name: " + name+
", Gesch.: " + geschlecht+ @Override
", Geb.Jahr: " + (gebJahr != null?gebJahr.getValue():"keines vorhanden")+ public int hashCode() {
", Alter: " + berechneAlter()+ return Objects.hash(eintrJahr, gebJahr, gesch, name);
", Eintr.Jahr: " + (eintrJahr != null?eintrJahr.getValue():"keines vorhanden")+ }
", Dienstalter: "+ berechneDienstalter() +
", Gehalt: " + berechneGehalt(); @Override
} public boolean equals(Object obj) {
if (this == obj)
public void print() return true;
{ if (obj == null)
System.out.println(this); //System.out.println(toString()) return false;
} if (getClass() != obj.getClass())
return false;
public String toStringCsv() Mitarbeiter other = (Mitarbeiter) obj;
{ return Objects.equals(eintrJahr, other.eintrJahr) && Objects.equals(gebJahr, other.gebJahr)
char sep = ';'; // "Trennzeichen" zwischen den Attribut-Werten && gesch == other.gesch && Objects.equals(name, other.name);
}
StringBuilder sb = new StringBuilder();
// ------------------------------------ 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());
}
} }

View File

@ -15,7 +15,7 @@ import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
// 2022-04-01 4BAIF // 2022-04-05 4BAIF
// Umgestellt auf ArrayList // Umgestellt auf ArrayList
// mit public float berechneDurchnittsalter() // mit public float berechneDurchnittsalter()
@ -51,7 +51,10 @@ import java.util.List;
// 2022-03-29 exportMitarbeiterCsv // 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 { public class Personalbuero {
private ArrayList<Mitarbeiter> mitarbeiter; // eine ArrayList ist "getypt" private ArrayList<Mitarbeiter> mitarbeiter; // eine ArrayList ist "getypt"
@ -77,7 +80,11 @@ public class Personalbuero {
// if (anzahl < mitarbeiter.length) // if (anzahl < mitarbeiter.length)
// { // {
// mitarbeiter[anzahl] = ma; // 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 ++; // anzahl ++;
// return true; // return true;
// } // }
@ -317,9 +324,9 @@ public class Personalbuero {
public void saveMitarbeiter() throws PersonalException { public void saveMitarbeiter() throws PersonalException {
String fSep = System.getProperty("file.separator"); String fSep = System.getProperty("file.separator");
// String strPfadName = "c:\\scratch\\mitarbeiter.ser"; //String strPfadName = "c:\\scratch\\mitarbeiter.ser";
String strPfadName = "c:" + fSep + "scratch" + fSep + "mitarbeiter.ser"; String strPfadName = "c:"+ fSep + "scratch" + fSep + "mitarbeiter.ser";
try ( // try with ressources -> close() erfolgt "automatisch" try ( // try with ressources -> close() erfolgt "automatisch"
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(strPfadName));) { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(strPfadName));) {
// hier erfolgt das "Speichern" // hier erfolgt das "Speichern"
@ -333,24 +340,30 @@ public class Personalbuero {
} }
// loadMitarbeiter Variante 2 OHNE suppressWarning -> empfohlen // loadMitarbeiter Variante 2 OHNE suppressWarning -> empfohlen
public void loadMitarbeiter() throws PersonalException { public void loadMitarbeiter() throws PersonalException
{
String fSep = System.getProperty("file.separator"); String fSep = System.getProperty("file.separator");
// String strPfadName = "c:\\scratch\\mitarbeiter.ser"; //String strPfadName = "c:\\scratch\\mitarbeiter.ser";
String strPfadName = "c:" + fSep + "scratch" + fSep + "mitarbeiter.ser"; String strPfadName = "c:"+ fSep + "scratch" + fSep + "mitarbeiter.ser";
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(strPfadName))) {
List<?> tempMitarbeiter = (List<?>) ois.readObject();
try ( ObjectInputStream ois =
new ObjectInputStream(new FileInputStream(strPfadName)))
{
List <?> tempMitarbeiter = (List <?>) ois.readObject();
mitarbeiter.clear(); // ersetzen und NICHT hinzufuegen mitarbeiter.clear(); // ersetzen und NICHT hinzufuegen
for (Object o : tempMitarbeiter) { for (Object o : tempMitarbeiter)
if (o instanceof Mitarbeiter) { {
aufnehmen((Mitarbeiter) o); if (o instanceof Mitarbeiter)
{
aufnehmen((Mitarbeiter)o);
} }
} }
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
throw new PersonalException("Datei-Fehler bei loadMitarbeiter(): " + e.getMessage()); throw new PersonalException("Datei-Fehler bei loadMitarbeiter(): " + e.getMessage());
} catch (IOException e) { } catch (IOException e) {
@ -359,7 +372,7 @@ public class Personalbuero {
throw new PersonalException("Klassen-Fehler bei loadMitarbeiter(): " + e.getMessage()); throw new PersonalException("Klassen-Fehler bei loadMitarbeiter(): " + e.getMessage());
} }
} }
// Variante1: es geht "typsicherer" -> Variante2 // Variante1: es geht "typsicherer" -> Variante2
// @SuppressWarnings("unchecked") // funktionsfaehige allerdings nicht empfohlene Variante1 // @SuppressWarnings("unchecked") // funktionsfaehige allerdings nicht empfohlene Variante1
// public void loadMitarbeiter() throws PersonalException // public void loadMitarbeiter() throws PersonalException
@ -380,72 +393,94 @@ public class Personalbuero {
// throw new PersonalException("Klassen-Fehler bei loadMitarbeiter(): " + e.getMessage()); // 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 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"); String nLn = System.getProperty("line.separator");
try (BufferedWriter bw = new BufferedWriter(new FileWriter(strPfadName))) { try ( BufferedWriter bw = new BufferedWriter(new FileWriter(strPfadName)))
for (Mitarbeiter mit : mitarbeiter) { {
// bw.write(mit.toString() + "\n"); for (Mitarbeiter mit : mitarbeiter)
{
//bw.write(mit.toString() + "\n");
bw.write(mit.toString() + nLn); // mit Line-Separator bw.write(mit.toString() + nLn); // mit Line-Separator
} }
} catch (IOException e) { } 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 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"); 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); StringBuilder sb = new StringBuilder(100000);
for (Mitarbeiter mit : mitarbeiter) for (Mitarbeiter mit : mitarbeiter)
sb.append(mit.toStringCsv()).append(nLn); // .append("\n"); sb.append(mit.toStringCsv()).append(nLn); // .append("\n");
bw.write(sb.toString()); bw.write(sb.toString());
} catch (IOException e) { } 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 fSep = System.getProperty("file.separator");
String strPfadName = "c:" + fSep + "scratch" + fSep + "mitarbeiter.csv"; String strPfadName = "c:"+fSep+"scratch"+fSep+"mitarbeiter.csv";
try (BufferedReader br = new BufferedReader(new FileReader(strPfadName))) { try(BufferedReader br = new BufferedReader(new FileReader(strPfadName)))
{
String zeile; String zeile;
String[] zeilenTeile; String[] zeilenTeile;
String sep = ";"; // erwartetes Trennzeichen in der csv-Datei String sep = ";"; // erwartetes Trennzeichen in der csv-Datei
// Muster: "Vorauslesen" // Muster: "Vorauslesen"
zeile = br.readLine(); // wenn keine Zeile gefunden, dann return null zeile = br.readLine(); // wenn keine Zeile gefunden, dann return null
while (zeile != null) { while(zeile != null)
{
zeilenTeile = zeile.trim().split(sep); zeilenTeile = zeile.trim().split(sep);
// Welcher Konstruktor wird aufgerufen? // Welcher Konstruktor wird aufgerufen?
// Wie ermitteln wir den Mitarbeiter-Typ? // Wie ermitteln wir den Mitarbeiter-Typ?
if (zeile.contains("Angestellter")) { if (zeile.contains("Angestellter"))
{
aufnehmen(new Angestellter(zeilenTeile)); aufnehmen(new Angestellter(zeilenTeile));
} else }
; // if ((zeile.contains("Freelancer")) else
// else if (zeile.contains("Freelancer"))
// if ((zeile.contains("Arzt")) {
// else unbekannter Mitarbeiter-Typ aufnehmen(new Freelancer(zeilenTeile));
}
else
if (zeile.contains("Arzt"))
{
aufnehmen(new Arzt(zeilenTeile));
}
else
; // hier Mitarbeiter-Typ(en)
// zukuenftiger Erweiterungen ergaenzen
zeile = br.readLine(); zeile = br.readLine();
} }
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
throw new PersonalException("Datei-Fehler bei importMitarbeiterCsv(): " + e.getMessage()); throw new PersonalException("Datei-Fehler bei importMitarbeiterCsv(): "
+ e.getMessage());
} catch (IOException e) { } 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"); sb.append("keine Mitarbeiter im Personalbuero");
return sb.toString(); return sb.toString();
} }
public void print() { public void print() {
System.out.println(this); System.out.println(this);
} }

View File

@ -6,7 +6,7 @@ import model.Freelancer;
import model.PersonalException; import model.PersonalException;
import model.Personalbuero; import model.Personalbuero;
// 2022-04-01 // 2022-04-05
public class TestImport public class TestImport
{ {
@ -22,7 +22,8 @@ public class TestImport
System.out.println(); System.out.println();
// zeilenTeile-Konstruktoren testen // 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[] {})); // Array-Fehler: Index 1 out of bounds for length 0
// pb.aufnehmen(new Angestellter(new String[] {"", "", "", "",""})); // Fehler: falscher Parameterwert name // 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(pb); // Hans, Hannes
System.out.println(); System.out.println();
// System.out.println("TODO: Personalbuero.importMitarbeiterCsv() ist noch zu implementieren!!!"); // TODO
pb.importMitarbeiterCsv(); pb.importMitarbeiterCsv();
System.out.println(pb); // Hans, Hannes, Alfred, Anna, Wolfgang System.out.println(pb); // Hans, Hannes, Alfred, Anna, Wolfgang
System.out.println(); System.out.println();
try { try {
Freelancer f2 = new Freelancer("Anna", 'w', Year.of(1976), Year.of(2002), 100f, 10); 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) { catch (PersonalException e) {
System.out.println("!!! Fehler bei TestImport !!!" +nLn+ e.getMessage()); System.out.println("!!! Fehler bei TestImport !!!" +nLn+ e.getMessage());
@ -52,13 +52,15 @@ public class TestImport
System.out.println(); System.out.println();
Angestellter a1 = new Angestellter("Alfred", 'm', Year.of(1977), Year.now()); 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) catch (PersonalException e)
{ {
System.out.println("!!! Fehler bei TestImport !!!" +nLn+ e.getMessage()); System.out.println("!!! Fehler bei TestImport !!!" +nLn+ e.getMessage());
} }
} }
} }

View File

@ -34,7 +34,7 @@ public class TestPersonalbueroMain {
testSaveMitarbeiter(); testSaveMitarbeiter();
testLoadMitarbeiter(); testLoadMitarbeiter();
testExportMitarbeiter(); testExportMitarbeiter();
} catch (Exception e) { } catch (Exception e) {
@ -47,7 +47,7 @@ public class TestPersonalbueroMain {
private static void testExportMitarbeiter() { private static void testExportMitarbeiter() {
System.out.println("+++++++++++++++++++++++ testExportMitarbeiter +++++++++++++++++++++++++\n"); System.out.println("+++++++++++++++++++++++ testExportMitarbeiter +++++++++++++++++++++++++\n");
try { try {
Personalbuero pb = new Personalbuero(); Personalbuero pb = new Personalbuero();
@ -55,17 +55,17 @@ public class TestPersonalbueroMain {
pb.aufnehmen(a1); pb.aufnehmen(a1);
Freelancer f2 = new Freelancer("Anna", 'w', Year.of(1976), Year.of(2002), 100f, 10); // 1000 Freelancer f2 = new Freelancer("Anna", 'w', Year.of(1976), Year.of(2002), 100f, 10); // 1000
pb.aufnehmen(f2); pb.aufnehmen(f2);
System.out.println(pb); // Alfred / Anna System.out.println(pb); // Alfred / Anna
System.out.println(); System.out.println();
pb.exportMitarbeiter(); pb.exportMitarbeiter();
System.out.println("Die Mitarbeiter wurden exportiert"); System.out.println("Die Mitarbeiter wurden exportiert");
} catch (PersonalException e) { } catch (PersonalException e) {
System.out.println(e.getMessage()); System.out.println(e.getMessage());
} }
} }
public static void testSaveMitarbeiter() { public static void testSaveMitarbeiter() {