package com.xx.oo;
public interface Operation {
double apply(double x,double y);
}
package com.xx.oo;
import java.util.Arrays;
import java.util.Collection;
public enum BasicOperation implements Operation {
PLUS("+"){
public double apply(double x,double y){return x+y;}
},
MINS("-"){
public double apply(double x,double y){return x-y;}
};
private final String symbol;
BasicOperation(String symbol){
this.symbol = symbol;
}
public static void main(String[] args) {
test(BasicOperation.class, 6, 4);
test2(Arrays.asList(BasicOperation.values()), 6, 4);
}
private static <T extends Enum<T> & Operation> void test(Class<T> opSet,double x,double y){
for(Operation op : opSet.getEnumConstants()){
System.out.println(op.apply(x, y));
}
}
private static void test2(Collection<? extends Operation> opSet,double x ,double y){
for(Operation op:opSet){
System.out.println(op.apply(x, y));
}
}
}
package com.xx.oo;
public enum ExtendenOperation implements Operation {
EXP("*"){
public double apply(double x,double y){
return x*y;
}
},
MKOP("/"){
public double apply(double x,double y){
return x/y;
}
};
private final String symbol;
ExtendenOperation(String symbol){
this.symbol = symbol;
}
}
===================================================================================
package com.xx.oo;
/**
* 代替switch
* @author Administrator
*
*/
public class TestEnum1 {
public static void main(String[] args) {
System.out.println(PayrollDay.MONDAY.pay(9, 12));
}
enum PayrollDay{
MONDAY(PayType.WEEKDAY);
private final PayType payType;
PayrollDay(PayType payType){
this.payType = payType;
};
/**
*
* @param hours 上班时间
* @param payRate 加班每小时多少钱
* @return
*/
double pay(double hoursWorked,double payRate){
return payType.pay( hoursWorked, payRate);
}
}
enum PayType{
//工作日加班
WEEKDAY{
double overtimePay(double hours,double payRate){
return hours<=8?0:(hours-8)*payRate;
}
},
//周末加班
WEEKEND{
double overtimePay(double hours,double payRate){
return hours*payRate;
}
};
abstract double overtimePay(double hoursWorked,double paypayRate);
//正常上班时长
private static final int HOUS_PER_SHIFT = 8;
//加班每小时金额
private static final double ONE_HOURS_PAY = 28;
/**
*
* @param hours 上班时间
* @param payRate 加班每小时多少钱
* @return
*/
double pay(double hours,double payRate){
double basePay = hours>HOUS_PER_SHIFT?HOUS_PER_SHIFT*ONE_HOURS_PAY:hours*ONE_HOURS_PAY;
return basePay+overtimePay(hours,payRate);
}
}
}