Programming lesson
Polymorphic Payroll with Birthday Bonus: A Java OOP Tutorial for CSCI 470/502
Learn how to add a birthday bonus to a polymorphic payroll system in Java. This tutorial covers modifying the Employee class, using the Date class, and implementing polymorphic payroll processing with a $100 bonus for employees whose birthday month matches the current month.
Introduction: Why Polymorphism Matters in Modern Payroll Systems
In the world of object-oriented programming (OOP), polymorphism is a cornerstone concept that enables flexible and maintainable code. Imagine a large company like a popular AI startup or a gaming giant that processes payroll for different types of employees—hourly, salaried, commissioned—each with their own pay calculation logic. Polymorphism allows you to treat all employees uniformly while each object knows how to compute its own pay. This tutorial, tailored for CSCI 470/502 Assignment 5, walks you through adding a birthday bonus to a polymorphic payroll system in Java. By the end, you'll understand how to integrate a Date class, modify the Employee hierarchy, and use polymorphic loops to apply a $100 bonus when the current month matches an employee's birth month.
Understanding the Starter Code and the Assignment Goal
Your assignment provides a starter code package containing an Employee abstract class, concrete subclasses like SalariedEmployee, HourlyEmployee, CommissionEmployee, and BasePlusCommissionEmployee, along with a Date class. The goal is to:
- Add a
birthDateinstance variable (of typeDate) to theEmployeeclass. - Add getter methods to the
Dateclass to retrieve month, day, and year. - Modify the payroll processing loop to check if the current month matches the employee's birth month; if so, add a $100 bonus to the payroll amount.
This assignment reinforces key OOP concepts: inheritance, polymorphism, and encapsulation. It also mirrors real-world scenarios where companies like Netflix or Spotify might offer birthday perks to employees.
Step 1: Enhance the Date Class with Getter Methods
The provided Date class likely has a constructor that takes month, day, and year, but may lack getters. You need to add methods like getMonth(), getDay(), and getYear() to access the private fields. For example:
public int getMonth() {
return month;
}
public int getDay() {
return day;
}
public int getYear() {
return year;
}These getters are essential for comparing the birth month with the current month later in the payroll loop.
Step 2: Add birthDate to the Employee Abstract Class
In the Employee class, add a private instance variable:
private Date birthDate;Modify the constructor to accept a Date parameter and initialize it. Also, provide a getter method getBirthDate() that returns the Date object. This encapsulation ensures that subclasses inherit the birth date without duplicating code. For example:
public Date getBirthDate() {
return birthDate;
}Now, update each subclass constructor to pass the birth date to the superclass constructor using super(firstName, lastName, socialSecurityNumber, birthDate).
Step 3: Create an Array of Employees and Process Payroll Polymorphically
In your test application (e.g., PayrollSystemTest), create an array of Employee references and populate it with various employee objects. For instance:
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(12, 10, 1985), 16.75, 40);
employees[2] = new CommissionEmployee("Sue", "Jones", "333-33-3333", new Date(3, 22, 1992), 10000, .06);
employees[3] = new BasePlusCommissionEmployee("Bob", "Lewis", "444-44-4444", new Date(6, 5, 1988), 5000, .04, 300);Then, loop through the array and call the earnings() method polymorphically. Before adding the bonus, determine the current month. You can use java.time.MonthDay or simply hardcode a month for testing (e.g., June = 6). For each employee, check if the birth month equals the current month:
int currentMonth = 6; // June
for (Employee emp : employees) {
double pay = emp.earnings();
if (emp.getBirthDate().getMonth() == currentMonth) {
pay += 100.00;
System.out.printf("Happy Birthday! Bonus added for %s%n", emp.getFirstName());
}
System.out.printf("Pay for %s: $%.2f%n", emp.getFirstName(), pay);
}This polymorphic loop works because each subclass overrides earnings() to compute its own pay, and the bonus logic is applied uniformly.
Real-World Analogy: Birthday Bonuses in Tech and Gaming
Many companies offer birthday perks. For example, a gaming company like Epic Games might give employees a bonus on their birthday month. Similarly, in the world of AI, companies like OpenAI could use a polymorphic payroll system to handle different employee types—engineers, researchers, support staff—and apply bonuses seamlessly. This assignment mirrors such real-world payroll processing, making it highly relevant.
Common Pitfalls and Tips
- Don't forget to import the Date class if it's in a different package. Ensure your project structure is correct.
- Use the provided Date class as-is; do not modify its internal representation unless necessary. Just add getters.
- Test with multiple months to verify that only employees with the matching birth month receive the bonus.
- Watch for floating-point precision when adding 100.00 to earnings; use
BigDecimalif needed, but double is acceptable for this assignment.
Polymorphism in Action: The Power of One Loop
The beauty of polymorphism is that you can process different employee types in a single loop without using instanceof or type checking. The JVM dynamically calls the correct earnings() method based on the actual object type. This reduces code duplication and makes the system easy to extend. For instance, if you later add a ContractEmployee class, it will automatically work in the same loop without changes.
Conclusion
By completing this assignment, you'll gain hands-on experience with polymorphism, inheritance, and encapsulation in Java. You'll also learn how to integrate a simple Date class and apply business rules like birthday bonuses. These skills are directly applicable to building real-world payroll systems, whether for a small startup or a large enterprise. Remember to test your output against the sample provided and submit only your .java files. Happy coding!