为了计算所得税,我尝试使用枚举策略方法来使逻辑更加简洁。但最终我并不满意,主要是因为我必须为收入组别,限额和费率编写不同的枚举。这是因为它们都是不同性质的常量。但由于这个代码看起来不紧凑,似乎缺乏封装。关于枚举策略方法的疑问
我的担心是真的吗?请让我知道您的意见或更好的方法。
说,是所得税基团和相应的比率如下:
- 收入之间0 - 500000:10% 征税
- 收入之间500001 - 百万:收入的20%的应纳税
- 1000001 - 无限:30%可征税
例如,所得税适用于的1200000的收入将是200000(1200000 - 1000000) 30%500000(1000000 - 500000) + 20%的500000(500000 - 0) + 10% = 160000
代码 :
package itcalc;
public class IncomeTaxCalculatorImpl {
private enum IncomeGroup {
ONE(Limit.GROUP_ONE_LIMIT) {
@Override
public double calculate(double income) {
return income * Rate.GROUP_ONE_RATE.value/100;
}
},
TWO(Limit.GROUP_TWO_LIMIT) {
@Override
public double calculate(double income) {
return ((income - Limit.GROUP_ONE_LIMIT.maximum)
* Rate.GROUP_TWO_RATE.value/100)
+ ONE.calculate(Limit.GROUP_ONE_LIMIT.maximum);
}
},
THREE(Limit.GROUP_THREE_LIMIT) {
@Override
public double calculate(double income) {
return ((income - Limit.GROUP_TWO_LIMIT.maximum)
* Rate.GROUP_THREE_RATE.value/100)
+ TWO.calculate(Limit.GROUP_TWO_LIMIT.maximum
- Limit.GROUP_ONE_LIMIT.maximum)
+ ONE.calculate(Limit.GROUP_ONE_LIMIT.maximum);
}
};
private final Limit limit;
private enum Limit {
GROUP_ONE_LIMIT(0, 500000),
GROUP_TWO_LIMIT(500001, 1000000),
GROUP_THREE_LIMIT(1000001, Double.MAX_VALUE);
private final double minimum;
private final double maximum;
private Limit(double minimum, double maximum) {
this.minimum = minimum;
this.maximum = maximum;
}
}
private enum Rate {
GROUP_ONE_RATE(10), GROUP_TWO_RATE(20), GROUP_THREE_RATE(30);
private final double value;
private Rate(double value) {
this.value = value;
}
}
private IncomeGroup(Limit limit) {
this.limit = limit;
}
abstract double calculate(double income);
}
public double calculate(double income) {
for (IncomeGroup group : IncomeGroup.values()) {
if (income >= group.limit.minimum
&& income <= group.limit.maximum) {
return group.calculate(income);
}
}
throw new IllegalArgumentException("Invalid Income Value");
}
}
重新格式化的代码;如果不正确请回复。 – trashgod 2010-07-08 18:08:44