一般项目中都习惯用单独的一个类定义系统中常用到底常量,可以达到便于集中管理、方便使用的目的:
public class OldConstants {
public static final int A = 1;
public static final int B = 2;
/**
* 有什么不好了,大家都这样用了很长时间了,没什么问题啊。
* 首先,它不是类型安全的,必须确保是int
* 其次,还要确保它的范围是1和2
* 最后,很多时候打印出来的时候,只看到 1 和2 ,
*/
public static final String on = "ON";
public static final String off = "OFF";
}
定义枚举
现在要做的是将枚举类当作常量使用,即将相关常量定义到一个枚举类中(这个类继承了Enum):
/**
* 级别枚举
* 看做一个普通的类,不能继承其他类(java是单继承,它已经继承了Enum)
* 可以添加其他方法,覆盖它本身的方法
*/
public enum GradeEnum {
A, B, C, D, E, incomplete, F;
}
使用枚举
public class Student {
private String firstName;
private String lastName;
private GradeEnum gradeEnum;
public Student(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFullName() {
return new StringBuffer(firstName).append("").append(lastName)
.toString();
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
//枚举类型
public GradeEnum getGradeEnum() {
return gradeEnum;
}
public void setGradeEnum(GradeEnum gradeEnum) {
this.gradeEnum = gradeEnum;
}
}
遍历枚举
/**
* 遍历枚举值
*/
public static void listGradeValues() {
// 增强的for循环
for (GradeEnum g : GradeEnum.values()
) {// 返回的是由GradeEnum实例组成的数组
System.out.println("级别有:" + g);
}
}
switch中使用枚举
public static void switchStatement() {
Student student = new Student("hello", "Enum");
StringBuffer outPutText = new StringBuffer(student.getFullName());
switch (student.getGradeEnum()) {
case A:
outPutText.append("excelled with a grade of A");
break;
case B:
case C:
outPutText.append("passed with a grade of").append(student.getGradeEnum().toString());
break;
case D:
case E:
outPutText.append("failed with a grade of").append(student.getGradeEnum().toString());
break;
case incomplete:
outPutText.append("did not complete the class");
break;
default:
outPutText.append("has a grade of").append(student.getGradeEnum().toString());
}
System.out.println(outPutText.toString());
}
保持良好的编程习惯,应该在switch中添加default语句,如果定义的枚举被人改动了也不会造成错误
/**
* 级别-枚举类型
*
*/
public enum GradeEnum {
A,B,C,D,E,incomplete,F
;
}
枚举在什么地方适用
一条普遍规则是,任何使用常量的地方,例如目前用switch
代码切换常量的地方。如果只有单独一个值(例如,鞋的最大尺寸,或者笼子中能装猴子的最大数目),则还是把这个任务留给常量吧。
但是,如果定义了一组值,而这些值中的任何一个都可以用于特定的数据类型,那么将枚举用在这个地方最适合不过,比如说性别、颜色、星期等。
public enum SexEnum {
male, female;
}
public enum Color {
RED, BLUE,GREEN,BLACK;
}
public enum WeekDay {
Mon("Monday"), Tue("Tuesday"), Wed("Wednesday"), Thu("Thursday"), Fri(
"Friday"), Sat("Saturday"), Sun("Sunday");
private final String day;
private WeekDay(String day) { //构造方法默认是private类型,不能是public
this.day = day;
}
public String getDay() {
return day;
}
}