学习目标:
1、了解枚举的概念
2、掌握枚举类enum的定义
3、能在项目中灵活的使用枚举类
学习过程:
一、什么是枚举
枚举类型主要提供固定的、规范化的一些常数(public static final),是一种自定义的基本数据类型,当我们需要声明一组命名的常数,而且这个变量只有几种可能的取值时,那么就可以将它定义为枚举类型。常见的有简单的枚举:
二、枚举的应用
枚举一般可以作为替换我们一直经常使用常量的用法,使用枚举会是代码更加清晰,容易维护,而且枚举类型支持switch、可以定义方法等等。所以枚举比常量更好用。
比如我们下面这个例子:
“场地有场地id、场地名称cname、场地描述cname和状态cond等几个属性,其中场地的状态使用:0 表示空闲,1 表示在用,2 表示维护。只能有这三个状态选项”。
那么我们如何设计一个javaBean表示上面这个场地对象呢?基本属性应该没有问题,关键是状态如何描述。
1、使用常量。为了更好的表示和提高代码的阅读性,我们可以定义几个常量表示场地的状态的几个选择,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | public class Space { // 0表示空闲 1表示在用 2表示维护 public static final int FREE= 0 ; public static final int USING= 1 ; public static final int REPIRE= 2 ; private int id; private String cname; private String cdesc; private int cond; public int getId() { return id; } public void setId( int id) { this .id = id; } public String getCname() { return cname; } public void setCname(String cname) { this .cname = cname; } public String getCdesc() { return cdesc; } public void setCdesc(String cdesc) { this .cdesc = cdesc; } public int getCond() { return cond; } public void setCond( int cond) { this .cond = cond; } } |
我们定义场地对象时候,设置场地的状态就可以使用常量的表示,不用使用无意义的数字了,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class Run { public static void main(String[] args) { Space s1= new Space(); s1.setId( 1 ); s1.setCname( "场地1" ); s1.setCdesc( "羽毛球场地" ); s1.setCond(Space.FREE); } } |
使用常量对于少数的几个状态还是很实用的,但是使用常量也有几个问题:不利于代码的维护,代码重用性不强;如果状态很多,那么定义的常量也会很多;并不能限制状态就只能有这几个选项,比如上面的例子我们设置状态数据为100:s1.setCond(100),代码也没有错误,但是这么明显不符合逻辑。使用枚举可以很好的解决上面的这些问题。
2、改用枚举。定义一个枚举类。
1 2 3 4 5 | public enum State { Free, Using, Repair; } |
修改Space类的cond属性的类型为该枚举类型。删除原来的所有的常量定义。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | public class Space { // 0表示空闲 1表示在用 2表示维护 /*public static final int FREE=0; public static final int USING=1; public static final int REPIRE=2;*/ private int id; private String cname; private String cdesc; private State cond; //修改为枚举类型 public int getId() { return id; } public void setId( int id) { this .id = id; } public String getCname() { return cname; } public void setCname(String cname) { this .cname = cname; } public String getCdesc() { return cdesc; } public void setCdesc(String cdesc) { this .cdesc = cdesc; } public State getCond() { return cond; } public void setCond(State cond) { this .cond = cond; } } |
这时候在定义Space对象的cond属性就只能是枚举的几个属性了。那么状态原来几个数字表示如何获得呢?下面我们可以为这个枚举添加方法。
3、为枚举添加方法。
修改枚举类
1 2 3 4 5 6 7 8 9 10 11 | public enum State { //调用枚举的构造方法 Free( 0 ),Using( 1 ),Repair( 2 ),Other( 3 ); public int value; State( int value){ this .value=value; } } |
在Run类中就可以通过value获得对应的数字了。
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Run { public static void main(String[] args) { Space s1= new Space(); s1.setId( 1 ); s1.setCname( "场地1" ); s1.setCdesc( "羽毛球场地" ); s1.setCond(State.Repair); //限制只能是枚举的几个选项 System.out.println(s1.getCond().value); } } |