【问题标题】:Implementing an enum payroll with Java使用 Java 实现枚举工资单
【发布时间】:2011-08-28 02:43:36
【问题描述】:

抱歉,我只是尝试做一个过去的考试问题以准备 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
   }



}

我真的不知道下一步该去哪里,请问有人可以帮助我吗?

【问题讨论】:

    标签: java enums


    【解决方案1】:

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

     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
    

    【讨论】:

      【解决方案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));
      }
      

      【讨论】:

        猜你喜欢
        • 2014-12-04
        • 2011-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多