Programming lesson
Polymorphe Gehaltsabrechnung mit Geburtstagsbonus: Ein Java-Tutorial für CSCI 470/502
Lerne, wie du in Java eine polymorphe Gehaltsabrechnung mit Geburtstagsbonus implementierst – inspiriert durch aktuelle Trends wie Spotify Wrapped und Gaming-Battle-Pässe.
Einführung: Warum Polymorphie und Geburtstage? Ein Trend-Vergleich
Stell dir vor, du entwickelst eine App wie Spotify Wrapped, die personalisierte Zusammenfassungen erstellt – aber für die Gehaltsabrechnung eines Unternehmens. Jeder Mitarbeiter (Angestellter, Manager, Vertriebler) hat eine andere Berechnungslogik, aber alle bekommen im Geburtsmonat einen Bonus von 100 $. Genau das lernst du in dieser Aufgabe: Polymorphie in Java, kombiniert mit einer Geburtstagsbonus-Logik. Ähnlich wie bei einem Battle Pass in einem Spiel (z. B. Fortnite), wo jeder Spieler individuelle Belohnungen erhält, aber der Mechanismus zur Freischaltung gleich ist.
Grundlagen: Die Employee-Klasse und das Date-Objekt
Zunächst musst du die vorhandene Employee-Klasse um eine private Instanzvariable birthDate vom Typ Date erweitern. Die Date-Klasse ist bereits gegeben – sie repräsentiert ein Datum mit Tag, Monat und Jahr. Füge Getter-Methoden hinzu, um auf Monat und Tag zuzugreifen. Warum ist das wichtig? Weil der Monat des Geburtsdatums mit dem aktuellen Monat (z. B. Juni 2026) verglichen wird, um den Bonus zu vergeben.
public class Employee {
private String firstName;
private String lastName;
private String socialSecurityNumber;
private Date birthDate; // neu
public Employee(String first, String last, String ssn, Date birth) {
firstName = first;
lastName = last;
socialSecurityNumber = ssn;
birthDate = birth;
}
public Date getBirthDate() {
return birthDate;
}
// andere Methoden...
}In der Date-Klasse benötigst du eine Methode getMonth(), die den Monat als int zurückgibt (1–12). Stelle sicher, dass der Konstruktor von Date die Werte validiert.
Polymorphie in Aktion: Die Gehaltsabrechnung
Das Kernstück der Aufgabe ist die polymorphe Berechnung. Du erstellst ein Array von Employee-Referenzen, das verschiedene Unterklassen enthält (z. B. SalariedEmployee, HourlyEmployee, CommissionEmployee, BasePlusCommissionEmployee). Jede Unterklasse überschreibt die Methode earnings(), um ihr spezifisches Gehalt zu berechnen. In einer Schleife rufst du für jedes Element earnings() auf – das ist Polymorphie: Zur Laufzeit wird die richtige Methode ausgeführt.
Employee[] employees = new Employee[4];
employees[0] = new SalariedEmployee("John", "Smith", "111-11-1111", new Date(6, 15, 1990), 800.00);
employees[1] = new HourlyEmployee("Karen", "Price", "222-22-2222", new Date(3, 22, 1985), 16.75, 40);
employees[2] = new CommissionEmployee("Sue", "Jones", "333-33-3333", new Date(6, 1, 1992), 10000, .06);
employees[3] = new BasePlusCommissionEmployee("Bob", "Lewis", "444-44-4444", new Date(12, 10, 1988), 5000, .04, 300);
for (Employee currentEmployee : employees) {
System.out.println(currentEmployee);
double earnings = currentEmployee.earnings();
int currentMonth = java.time.LocalDate.now().getMonthValue(); // Juni = 6
if (currentEmployee.getBirthDate().getMonth() == currentMonth) {
earnings += 100.00;
System.out.println("Geburtstagsbonus von 100 $ hinzugefügt!");
}
System.out.printf("Verdienst: $%.2f%n%n", earnings);
}Integration des Geburtstagsbonus
Der Bonus wird nur hinzugefügt, wenn der Monat des Geburtsdatums mit dem aktuellen Monat übereinstimmt. Da die Aufgabe annimmt, dass die Gehaltsabrechnung einmal pro Monat erfolgt, reicht ein einfacher Vergleich. In unserem Beispiel mit aktuellem Monat Juni 2026 erhalten also John (Geburtstag 15. Juni) und Sue (Geburtstag 1. Juni) den Bonus. Achte darauf, dass du den Bonus nicht in der earnings()-Methode einbaust, sondern erst in der Schleife – so bleibt die Methode unverändert und der Bonus wird nur bei der Abrechnung berücksichtigt.
Trend-Beispiel: Wie Netflix personalisierte Empfehlungen nutzt
Stell dir vor, Netflix würde jedem Nutzer im Geburtsmonat einen speziellen Film empfehlen. Die Empfehlungslogik ist polymorph: Für einen Serienfan wird eine andere Empfehlung generiert als für einen Dokumentarfilm-Fan. Der Geburtsmonat ist der Auslöser – genau wie in deiner Aufgabe. Dieses Pattern findest du auch in Gaming-Apps, die zum Geburtstag des Spielers besondere Skins oder Boni freischalten.
Häufige Fehler und Tipps
- Vergiss nicht, die Date-Klasse zu importieren – wenn sie im selben Package liegt, reicht die einfache Referenz.
- Getter-Methoden in Date: Stelle sicher, dass
getMonth()undgetDay()public sind. - Array-Typ: Verwende
Employee[]und nichtObject[], sonst musst du casten. - Aktuellen Monat ermitteln: Nutze
java.time.LocalDate.now().getMonthValue()(gibt 1–12 zurück). - Bonus nicht in earnings() einbauen – sonst wird er bei jedem Aufruf von earnings() addiert, was falsch ist.
Erweiterungsmöglichkeiten: Wie in der Fintech-Welt
In der Fintech-Branche (z. B. bei Klarna oder N26) werden ähnliche Mechanismen genutzt, um Kunden zum Geburtstag einen Cashback-Bonus zu gewähren. Du könntest deine App erweitern, indem du verschiedene Bonustypen einführst (z. B. 200 $ für Manager) – das wäre dann eine weitere Polymorphie-Ebene. Oder du speicherst die Geburtstage in einer Datenbank und rufst sie mit JDBC ab.
Fazit
Mit dieser Aufgabe lernst du nicht nur Polymorphie und die Integration einer externen Klasse, sondern auch, wie man zeitbasierte Logik in ein OOP-System einbaut. Der Geburtstagsbonus ist ein einfaches, aber wirkungsvolles Beispiel für reale Geschäftslogik. Wenn du die Aufgabe erfolgreich abgeschlossen hast, kannst du stolz sein – du hast ein Fundament für komplexere Systeme wie personalisierte Rabattaktionen oder dynamische Gehaltsmodelle gelegt.