赵雅智_Java JDK 5.0 枚举
为什么需要枚举?
class Student{
private String name;
private Grade grade;
……}

枚举类的属性
一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值
此类问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决。
JDK 5新增的 enum 关键字用于定义一个枚举类。
枚举类练习
设计一个Student类class Student{
private String name;
private Grade grade;
……}
要求:学生的grade只能是a,b,c,d,e五个级别。可以给学生设置成绩,并可以输出学生成绩情况(优,良,中,可,差)
package com.hbsi.enum1;
public class Student {
private String name;
private String grade;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
if(!grade.matches("[ABCDE]")){
throw new IllegalArgumentException("输入的成绩不符合要求!!");
}
this.grade = grade;
}
}
package com.hbsi.enum1;
public class Demo1 {
/**
* @param args
*/
public static void main(String[] args) {
Student s=new Student();
s.setName("张三");
s.setGrade("F");
}
}
手动实现枚举类:
- 通过 private 将构造器隐藏起来
- 把这个类的所有可能实例都使用 public static final 修饰
- 属性不应允许被改动, 所以应该使用 private final 修饰
package com.hbsi.enum2;
public class Student {
private String name;
private Grade grade;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
}
class Grade{
private Grade(){}
public static final Grade A=new Grade();
public static final Grade B=new Grade();
public static final Grade C=new Grade();
public static final Grade D=new Grade();
public static final Grade E=new Grade();
}
package com.hbsi.enum2;
public class Demo1 {
/**
* @param args
*/
public static void main(String[] args) {
Student s=new Student();
s.setName("张三");
s.setGrade(Grade.A);
}
}
上面写法比较麻烦,java中提供了一种更方便的方法----枚举类可以解决上面的问题
JDK 1.5 新增的 enum 关键字用于定义枚举类
枚举类也是一种特殊形式的Java类。
枚举类和普通类的区别:
- 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类
- 枚举类的构造器只能使用 private 访问控制符
- 枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾). 列出的实例系统会自动添加 public static final 修饰
- JDK5中扩展了switch语句,它除了可以接收int, byte, char, short外,还可以接收一个枚举类型
- 若枚举只有一个成员, 则可以作为一种单例模式的实现方式
没有参数的构造方法:
package com.hbsi.enum2;
public class Student {
private String name;
private Grade grade;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
}
enum Grade{
A,B,C,D,E;
}
/*class Grade{
private Grade(){}
public static final Grade A=new Grade();
public static final Grade B=new Grade();
public static final Grade C=new Grade();
public static final Grade D=new Grade();
public static final Grade E=new Grade();
}*/
package com.hbsi.enum2;
public class Demo1 {
/**
* @param args
*/
public static void main(String[] args) {
Student s=new Student();
s.setName("张三");
s.setGrade(Grade.A);
}
}
枚举类的属性
- 枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰
- 枚举类的使用 private final 修饰的属性应该在构造器中为其赋值
- 若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数
package com.hbsi.enum3;
public class Student {
private String name;
private Grade grade;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
}
enum Grade{
A("100-90"),B("89-80"),C("79-70"),D("69-60"),E("59-0");
private String value;
private Grade(String value){
this.value=value;
}
public String getValue() {
return value;
}
}
package com.hbsi.enum3;
public class Demo1 {
/**
* @param args
*/
public static void main(String[] args) {
Student s=new Student();
s.setName("张三");
s.setGrade(Grade.A);
System.out.println(Grade.B.getValue());
}
}
使用内部类:
package com.hbsi.enum4;
public class Student {
private String name;
private Grade grade;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
}
enum Grade{
A("100-90") {
@Override
public String toLocalGrade() {
// TODO Auto-generated method stub
return "优";
}
},
B("89-80") {
@Override
public String toLocalGrade() {
// TODO Auto-generated method stub
return "良";
}
},
C("79-70") {
@Override
public String toLocalGrade() {
// TODO Auto-generated method stub
return "中";
}
},
D("69-60") {
@Override
public String toLocalGrade() {
// TODO Auto-generated method stub
return "可";
}
},
E("59-0") {
@Override
public String toLocalGrade() {
// TODO Auto-generated method stub
return "差";
}
};
private String value;
private Grade(String value){
this.value=value;
}
public String getValue() {
return value;
}
public abstract String toLocalGrade();
}
package com.hbsi.enum4;
public class Demo1 {
/**
* @param args
*/
public static void main(String[] args) {
Student s=new Student();
s.setName("张三");
s.setGrade(Grade.A);
String str=Grade.B.getValue();
String str1=Grade.B.toLocalGrade();
System.out.println(str+"...."+str1);
}
}
枚举类常用方法:
Java中声明的枚举类,均是java.lang.Enum类的孩子,它继承了Enum类的所有方法。常用方法:
- name():返回此枚举常量的名称,在其枚举声明中对其进行声明
- ordinal():返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
- valueof(Class enumClass, String name):返回带指定名称的指定枚举类型的枚举常量。 静态方法
- values() 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便。
练习:请编写一个关于星期几的枚举WeekDay
要求:
枚举值:Mon,Tue,Wed,Thu,Fri,Sat,Sun
该枚举要有一个方法,调用该方法返回中文格式的星期。
package net.****.high;
public class TestWeek {
private Week week;
public Week getWeek() {
return week;
}
public void setWeek(Week week) {
this.week = week;
}
}
enum Week{
Mon("Monday") {
@Override
public String toLocalWeek() {
// TODO Auto-generated method stub
return "星期一";
}
},
Tue("Tuesday") {
@Override
public String toLocalWeek() {
// TODO Auto-generated method stub
return "星期二";
}
},
Wed("Wednesday") {
@Override
public String toLocalWeek() {
// TODO Auto-generated method stub
return "星期三";
}
},
Thu("Thuesday") {
@Override
public String toLocalWeek() {
// TODO Auto-generated method stub
return "星期四";
}
},
Fri("Friday") {
@Override
public String toLocalWeek() {
// TODO Auto-generated method stub
return "星期五";
}
},
Sat("Satueday"){
@Override
public String toLocalWeek() {
// TODO Auto-generated method stub
return "星期六";
}
},
Sun("Sunday"){
@Override
public String toLocalWeek() {
// TODO Auto-generated method stub
return "星期日";
}
};
private String value;
private Week(String value){
this.value=value;
}
public String getValue() {
return value;
}
public abstract String toLocalWeek();
}
package net.****.high;
public class TestWeekDay {
/**
* @param args
*/
public static void main(String[] args) {
TestWeek t = new TestWeek();
t.setWeek(Week.Mon);
String str=Week.Mon.getValue();
String str1=Week.Mon.toLocalWeek();
System.out.println(str+"...."+str1);
}
}