一.枚举和静态常量区别
讲到枚举我们首先思考,它和public static final string 修饰的常量有什么不同。
我举枚举的两个优点:
1. 保证了类型安全:调用者无法随意传一个 int或者string 等值;
2.代码可读性非常高;
举个例子:
在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如春夏秋冬四个数据元素组成了四季的“数据集”。
你写了方法get(string season),输入的类型只能是string类型,同时要string只能是(春、夏。秋。冬)。
这个时候。你写四个字符串常量
1
2
3
4
5
6
|
public class common { public static final string spring= "春" ; public static final string season= "夏" ; public static final string summer= "秋" ; public static final string autumn= "冬" ; } |
在get方法里放入get(common.season),确实是把"春",放进去了,但是这个时候你会发现这里面有一个隐患,你get(string season),毕竟放入的是string类型的,如果新同事或者不知情的同事,不知道这个方法里只能放“春、夏、秋、冬”,它放了个其期它字符串比如get("小小“),这个时候,在编译期它是不会报错的,只有运行之后,才发现错了。
为了防止上面的隐患,枚举出现了
1
2
3
4
5
6
7
|
public enum season { spring( "春" ), summer( "夏" ), autumn( "秋" ), winter( "冬" ); ..... } |
这个时候,我们修改get方法的传参,改成get(season season) 这个时候加入get(season.spring),这就能保证传入的参数只能是这几个。
二.理解枚举
首要我们要明确,其实枚举也是个class类,我写个枚举来理解。
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
46
47
48
|
//我们把枚举当做一个普通类 public enum season { spring( 1 , "春" ), summer( 2 , "夏" ), autumn( 3 , "秋" ), winter( 4 , "冬" ); //这里最后一个一定要分号,否则报错 /*我们可以理解成 *public static final season spring = new season(1,春); *public static final season summer = new season(2,夏); *public static final season autumn = new season(3,秋); *public static final season winter = new season(4,冬); *既然是对象,那下面就很好理解了 */ /* * 1.上面对象里放了两个参数,那下面就肯定要有这个类型的构造函数 * 2.这里是private,因为不能在被new对象了 */ private season( int code,string name) { this .name = name; this .code = code; } //对象的属性 private string name; private int code; //获取对象属性的方法 public string getname() { return this .name; } public string getcode() { return this .name; } //通过code获得对象,我们就可以获得对象的其它属性 public static season decode( int code) { season season = null ; for (season type : season.values()) { if (type.code==code) { season = type; break ; } } return season; } //重新tostring方法 public string tostring() { return this .name; } } |
上面这个例子,就很好解释了枚举,它和普通类没什么区别,只是用另一种写法创建了几个有属性的对象,这也必须写这样有属性的构造函数,仅此而已。
这里顺便列举下枚举的一些特点:
1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。
2. 枚举不能在继承其它类了,因为它默认继承了java.lang.enum
3. 常量值地址唯一,可以用==直接对比,性能会有提高.
4.enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。
5.enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定。
三.枚举的常见用法
第一种:switch运用
先建一个枚举:
1
2
3
4
5
6
|
public enum common { insert, modify, delete } //因为这里是无参的对象,所以可以用系统默认的构造函数。也不用写属性和方法。 |
在写实现代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public class commonutils { public static void gettype(common common){ common c=common; switch (c) { case insert: system.out.println( "进行插入操作" ); break ; case modify: system.out.println( "进行修改操作" ); break ; case delete: system.out.println( "进行删除操作" ); break ; } } public static void main(string[] args) { gettype(common.delete); //后台输出:进行删除操作 } } |
第二种用法,通过key值获得value值获取其它值
枚举类
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
|
public enum season { spring( 1 , "春" , "春天放风筝" ), summer( 2 , "夏" , "夏天去游泳" ), autumn( 3 , "秋" , "秋天去秋游" ), winter( 4 , "冬" , "冬天吃火锅" ); private season( int code,string name,string bz) { this .code = code; this .name = name; this .bz=bz; } private int code; private string name; private string bz; public static season decode( int code) { season season = null ; for (season type : season.values()) { if (type.code==code) { season = type; break ; } } return season; } public int getcode() { return code; } public string getname() { return name; } public string getbz() { return bz; } } |
测试类
好了,就写这么多,以后有需要会更深入了解。感谢大家对服务器之家的支持。
原文链接:https://www.cnblogs.com/qdhxhz/p/8337514.html