使用Java实现枚举工资单

时间:2011-05-18 14:08:53

标签: java enums

抱歉,只是为了准备Java考试而尝试做一个过去的考试问题,希望有人能告诉我我的解决方案是否正确。问题是:

使用Java枚举,实现工资计算的类。班级中的常数对应于一周中的正常日期:星期一,星期二......星期五,周末日:星期六和星期日以及银行假日,这是本周特别的一天。

该类应提供实例方法double pay ( double time, double payrate ),该方法返回当天工作的员工的总工资。计算规则如下:

给出的给定日期的工资
base pay = pay rate * hours worked.

此处,基本工资由以下人员给出:

base pay = pay rate * hours worked

当天的加班费由

给出
overtime pay = pay rate * overtime hours/2

加班时间取决于当天的种类。

正常工作日:对于正常工作日,加班时间是当天工作时数超过8小时。

周末:周末,加班时间是当天的工作时间。

银行假期:对于银行假期,超时工作时间是当天工作时数的1.5倍。

确保您的课程可维护。应该可以在不破坏现有代码的情况下添加和删除。提示:使用策略枚举模式实现您的类。

public class Payroll {
   public enum Day {
      MONDAY, TUESDAY, WEDNESDAY,THURSDAY, FRIDAY, SATURDAY, SUNDAY, BANK HOLIDAY;
   }

   public double pay( double time, double payrate ) {
      if ( day
   }



}

我无法确定下一步该怎么做,有人能帮我这个吗?

2 个答案:

答案 0 :(得分:4)

有一个提示要求策略枚举模式。这是一个起点:

 public enum Day {
    MONDAY(Type.NORMAL), TUESDAY(Type.NORMAL), WEDNESDAY(Type.NORMAL), 
    THURSDAY(Type.NORMAL), FRIDAY(Type.NORMAL), SATURDAY(Type.WEEKEND),
    SUNDAY(Type.WEEKEND), BANK_HOLIDAY(Type.BANK_HOLIDAY);

    private Type type;                         // <- the strategy
    private Day(Type type) {this.type=type;}

    public double pay(double time, double payRate) {
       // calculate the pay using the strategy: type.overtimePay(hours, payRate)
    }

    private enum Type {
      NORMAL {
         @Override
         double overtimePay(double hours, double payRate) {
            // TODO: implement
         }
      }
      // same for WEEKEND and BANK_HOLIDAY

      abstract double overtimePay(double hours, double payRate);
    }
 }

现在,如果你想计算薪水,应该可以用

 double pay = Day.MONDAY.pay(10.5, 16.50);

或方便(尚未实施的方法):

 double pay = getDay(aDate).pay(10.5, 16.50);  // getDay returns a Day enum

答案 1 :(得分:2)

根据Andreas_D的建议,您应该看一下策略枚举模式;例如,见article

以下是一些快速入侵的代码:

public enum PayRoll {

    MONDAY {
        public double pay( double time, double payrate ) {
            if (time <= 8)
                return payrate * time;
            else
                return payrate * 8 + payrate * (time - 8) / 2;
        }
    },

    // implement TUESDAY, WEDNESDAY,THURSDAY, FRIDAY

    SATURDAY {
        public double pay( double time, double payrate ) {
            return payrate * time / 2;
        }
    },

    // implement SUNDAY

    BANK_HOLIDAY {
        public double pay( double time, double payrate ) {
            return payrate * 1.5 * time / 2;
        }
    };


    public abstract double pay(double time, double payrate);
}

有了这些,您可以执行以下操作:

public static void main(String[] args) {
    PayRoll christmasDay = PayRoll.BANK_HOLIDAY;
    System.out.println(christmasDay.pay(5, 3));
}