思考一下:为什么需要枚举类?枚举类的产生背景是什么?
一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,比如成绩Grade只能为A、B、C、D、E其中的一种。类似的问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决。
1.如何创建枚举类
JDK 5新增的 enum 关键字用于定义一个枚举类
一个枚举也有构造函数(但是枚举类的构造函数必须是私有的)、字段和方法
1.1定义枚举类的构造方法和字段
package com.cj.study.enumeration;
public enum Grade {
A("90-100"),
B("80-89"),
C("70-79"),
D("60-69"),
E("0-59");
//A、B、C、D、E每一个都代表该枚举类的一个的实例对象,
//理解这句话很关键,可以参考下方注释掉的代码帮助理解
private Grade(String value){
this.value = value;
}
private String value;
public String getValue() {
return value;
}
}
//JDK1.5之前没枚举类时候的做法,
//对枚举类真正含义的理解,可以参考下边的代码
/*
public static Grade A = new Grade("90-100"); //这就相当于上边的A("90-100"),
public static Grade B = new Grade("80-89");//这就相当于上边的B("80-89"),
public static Grade C = new Grade("70-79");//这就相当于上边的C("70-79"),
public static Grade D = new Grade("60-69");//这就相当于上边的D("60-69"),
public static Grade E = new Grade("0-59");//这就相当于上边的E("0-59");
//构造函数私有化,不允许外界去new对象,只允许有ABCDE这几种
private Grade(String value){
this.value = value;
}
private String value;
public String getValue() {
return value;
}
*/
package com.cj.study.enumeration;
public class Student {
private String name;
//成绩:只能是A、B、C、D、E其中的一个
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;
}
}
package com.cj.study.enumeration;
import org.junit.Test;
public class Demo1 {
@Test
public void test1(){
Student s = new Student();
s.setName("张三");
s.setGrade(Grade.A);
Grade g = s.getGrade();
String v = g.getValue();
System.out.println(v);
}
}
1.2带抽象方法的枚举
package com.cj.study.enumeration;
public enum Grade {
A("90-100"){
public String toLocalString(){
return "优秀";
}
},
B("80-89"){
public String toLocalString(){
return "良好";
}
},
C("70-79"){
public String toLocalString(){
return "一般";
}
},
D("60-69"){
public String toLocalString(){
return "刚及格";
}
},
E("0-59"){
public String toLocalString(){
return "不及格";
}
};//ABCDE代表着自身的一个个的实例对象
private Grade(String value){
this.value = value;
}
private String value;
public String getValue() {
return value;
}
public abstract String toLocalString();
}
//上边的格式看起来不好理解,可以参考下方的理解
/*
public static Grade A = new Grade("90-100"){//匿名内部类实现抽象方法
public String toLocaleString(){
return "优秀";
}
};//这就相当于上边的A("90-100"),下边的BCDE和A一样,就不挨个儿写了
public static Grade B = new Grade("80-89");//这就相当于上边的B("80-89"),
public static Grade C = new Grade("70-79");//这就相当于上边的C("70-79"),
public static Grade D = new Grade("60-69");//这就相当于上边的D("60-69"),
public static Grade E = new Grade("0-59");//这就相当于上边的E("0-59");
private String value;
private Grade(String value){
this.value = value;
}
public abstract String toLocaleString();
*/
2.总结一下枚举类有哪些特性?
1、枚举类也是Java类,不过形式有点特殊。
2、枚举类中声明的每一个枚举值代表枚举类的一个实例对象,而且这个实例对象是静态的,所以才可以直接Grade.A
理解这句话很关键。
3、与java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须为私有的,这点不难理解,因为如果是公有的话,在外部就可以随便的去new了,那就失去枚举类本身的意义了,枚举本身的意义就在于数据不能是随意的,必须是列出来的一定范围内的值。
4、枚举类也可以实现接口、或继承抽象类。
5、JDK5中扩展了swith语句,它除了可以接收int, byte, char, short外,还可以接收一个枚举类型。
扫描二维码关注公众号,回复:
12426188 查看本文章
6、若枚举类只有一个枚举值,则可以当作单态设计模式使用。
特别需要注意和理解的两点:
1、枚举类的构造函数必须为私有的
2、枚举类中声明的每一个枚举值都代表该枚举类的一个实例对象
如果面试中问枚举的话,这两点也是经常被问到的
因为这两点可以看出你对枚举类是否真的理解了