我们在初学时用过if--else的语句,也用过switch,但是你会发觉如果嵌套过多代码可读性变差。
如以下我们写过通过分数给学生成绩评级,简写后的代码如下
A示例
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
int k=79;
System.out.print(exem(k));
}
public static String exem(int k)
{
int j=k/10;
String str=null;
switch (j) {
case 9:
str="优";
break;
case 8:
str="良";
break;
case 7:
str="良";
break;
case 6:
str="及格";
break;
default:
if(j>10||j<0)str="不存在的分数";
if(j<6)System.out.println("不及格");
if(k==100)str="优";
break;
}
return str;
}
}
B:
这样写有种面向过程的感觉,而且有点不符合人类思维,我们人类思考,首先是对优良 及格 不及格有一个概念,有知道他的范围.....然后再去判断他的分数
使用枚举进行重构:
public enum Exam {
A(90, 100, "优"), B(70, 89, "良"), C(60, 69, "及格"), D(0, 60, "不及格");
private int max;
private int min;
private String assess;
/***
* @param min
* 最小分数段
* @param max
* 最大分数段
* @param assess
* 评级
*/
private Exam(int min, int max, String assess) {
this.max = max;
this.min = min;
this.assess = assess;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "["+assess+":"+min + "~" + max+"]";
}
public static Exam get(int source) {
for (Exam e : Exam.values()) {
if (source <= e.max && source >= e.min) {
return e;
}
}
return null;
}
public String getAssess() {
return assess;
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(Exam.C);
System.out.println(Exam.get(59).getAssess());
System.out.println(Exam.get(79).getAssess());
}
}
反思,如果为了效率,我绝大多数会使用A示例,但是工程较大,就采用B示例,
因为B的可读性和修改性,扩展性,重用性都比A示例要好用的多。
相比A示例我们还知道各评级的分数段,在灵活性也变强了。
附带枚举类型的api方法