java enum类
1、可以在enum中添加变量和方法
先来看一段代码示例:
|
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
|
public enum State { Normal("正常态", 1), Update("已更新", 2), Deleted("已删除", 3), Fired("已屏蔽", 4); // 成员变量 private String name; private int index; // 构造方法,注意:构造方法不能为public,因为enum并不可以被实例化 private State(String name, int index) { this.name = name; this.index = index; } // 普通方法 public static String getName(int index) { for (State c : State .values()) { if (c.getIndex() == index) { return c.name; } } return null; } // get set 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } } |
从上面的代码中我们可以看到,定义完枚举值,然后在其后面加上分号,接着就可以定义其他的变量、方法了。另外需要特别说明的是,enum中的构造方法不可以用public标识,这样做是为了防止用户实例化enum。
2、可以用来定义常量
先来回顾一下Java中如何定义常量吧,看下面一段代码:
|
1
2
|
public static final int normalState = 1;private static final int updateState = 2; |
下面我们还可以用enum枚举来代替上面的常量定义,代码如下:
|
1
2
3
|
public enum State { Normal, Update, Deleted, Fired} |
在Java中用enum来定义常量在语法上没有什么优势,但是enum枚举类型可以提供更多的操作功能。
3、在enum中实现接口
先来看下面一段代码:
|
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
|
public interface ICanReadState { void read(); String getState();} public enum State implements ICanReadState { Normal("正常态", 1), Update("已更新", 2), Deleted("已删除", 3), Fired("已屏蔽", 4); private String name; private int index; private State(String name, int index) { this.name = name; this.index = index; } // 接口方法1 @Override public String getState() { return this.name; } // 接口方法2 @Override public void read() { System.out.println(this.index + ":" + this.name); } } |
和一般的类中使用接口一样,enum枚举中同样可以继承接口,并实现接口中的所有方法,这样做的好处在于可以更方便地对枚举中的值进行排序、比较等操作,封装性更好。
实例
我们先定义个简单枚举(这里只是个例子,就简单定义3个变量了):
|
1
2
3
4
5
6
|
public enum SqlTypeEnum { INSERT , UPDATE , DELETE , SELECT} |
此时解析SQL后,获取出来一个token,我们要获取这个token的枚举怎么获取呢?
这样获取:
|
1
2
|
String token = "select";SqlTypeEnum sqlTypeEnum = SqlTypeEnum.valueOf(token.toUpperCase()); |
如果没获取到,java会抛出一个异常哦:IllegalArgumentException No enum const class SqlTypeEnum.XXX
我做大写处理的原因是因为枚举也是大写的(当然如果你的枚举是小写的,那你就小写,不过混写比较麻烦哈),其实valueOf就是调用了枚举的底层映射:

如何避免错误使用 Enum
不过在使用 Enum 时候有几个地方需要注意:
- enum 类型不支持 public 和 protected 修饰符的构造方法,因此构造函数一定要是 private 或 friendly 的。也正因为如此,所以枚举对象是无法在程序中通过直接调用其构造方法来初始化的。
- 定义 enum 类型时候,如果是简单类型,那么最后一个枚举值后不用跟任何一个符号;但如果有定制方法,那么最后一个枚举值与后面代码要用分号';'隔开,不能用逗号或空格。
- 由于 enum 类型的值实际上是通过运行期构造出对象来表示的,所以在 cluster 环境下,每个虚拟机都会构造出一个同义的枚举对象。因而在做比较操作时候就需要注意,如果直接通过使用等号 ( ‘ == ’ ) 操作符,这些看似一样的枚举值一定不相等,因为这不是同一个对象实例。
java enum类的更多相关文章
- java enum类探索
参考网址1, 参考网址2 一直对枚举有点迷惑,现在试着理解枚举. 1.首先,普通类与枚举 的区别.拿两个例子比较吧 普通类: /** * 一个普通类 * @author Administrator * ...
- java enum类自定义属性
enum类自定义属性 这就是enum比static静态变量好用的地方了,可以赋予每一个枚举值若干个属性,例如 实例1: public enum GasStationChannel { ZH(" ...
- java 枚举类小结 Enum
好久没有接触枚举类了,差不多都忘了,今天抽出个时间总结一下吧.说实话,枚举类确实能够给我们带来很大的方便. 说明:枚举类它约定了一个范围,可以理解成只可以生成固定的几个对象让外界去调用,故枚举类中的构 ...
- JAVA基础--常用类 String,StringBuffer, 基础数据类型包装类, Math类, Enum类
字符串相关类: String, StringBuffer String类为不可变的字符序列 String s1="hello"; String s2="hello&quo ...
- Java Enum 枚举类的values方法
Enum类和enum关键字定义的类型都有values方法,但是点进去会发现找不到这个方法.这是因为java编译器在编译这个类(enum关键字定义的类默认继承java.lang.Enum)的时候 自动插 ...
- Java 基础复习 -- Enum 类
一.枚举类基本语法 在 Java SE5 中添加了一个看似很小的特性,即 enum 关键字,它使得我们在需要群组并使用枚举类型集时,可以很方便的处理. 所有的 enum 都继承自 java.lang. ...
- 如何使用Java中的Enum类
Java1.5 中出现了枚举类型.当一个值都在一个固定的范围内变化,那就可以使用 enum 类型来定义.比如说,一周有七天,一年有四季. 没有枚举类的时候,我们用常量来定义一组范围值的: public ...
- java enum
小谈Java Enum的多态性 博客分类: Java JavaAppleJDKJVMIDEA Enum+多态,我没说错,不过Enum是不可以被继承的,也不可以继承自别人,只是能实现接口而已,何谈多态 ...
- 【转】Java enum的用法详解
用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...
随机推荐
- tomcat+javaWeb+spring的一个都市供求管理系统
这个作为自己学习javaweb的第一个小项目,也是跟着视频自己学的,是来自java1234的小锋写的,那边有很多java视频可以作为学习参考哦 , 视频中使用的是tomcat作为后端,也( •̀ ω ...
- xargs 命令
1. xargs 很好用,可以将多个结果分段传给下一个命令进行计算 比如说find 找到很多个文件,又想对每个文件统计条数: find 20151201 -name "mjoys*.txt& ...
- 一些免费收费api收藏
转载:http://blog.csdn.net/sdjianfei/article/details/53157334 一 .api 1.http://apistore.baidu.com/astore ...
- Redis_持久化之RDB
rdb - Redis DataBase 官网介绍: 在指定的时间间隔内存中的数据集快照写入磁盘,也就是行话将的Snapshot快照,它恢复时是将快照文件直接读到内存中. 是什么: Redis会单独创 ...
- PHOG特征
PHOG特征 2016年7月13日 21:07:57 什么是PHOG PHOG是Pyramid HOG(pyramid histogram of oriented gradient)的简称,是在图像尺 ...
- 用jQuery调用微信api生成二维码
其实这个,也没什么实际用途,只能测试一下api能不能用. 1. 用Chrome打开一个https://api.weixin.qq.com/页面,会返回一个错误信息,忽略不管,F12打开控制台 2. 控 ...
- WPF元素可视化效果
在WPF中设置元素的可视化效果主要用到BlurEffect类和DropShadowEffect类.(目前只学到这两个,哈哈) 1.BlurEffect类 命名空间: System.Windows.Me ...
- Docker探索系列2之镜像打包与DockerFile
preface docker基本入门以后,可以试试打包docker镜像与dockerfile了 docker镜像 docker hub仓库有2类仓库,用户仓库和顶层仓库,用户仓库由docker用户创建 ...
- HD1160FatMouse's Speed(最长单调递增子序列)
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- mybatis的逆向工程
mybatis的逆向工程是很大的减少了程序员对代码的编写工作,由于mybatis是半自动的sql语句使用,我们在项目中一般都是采用逆向工程来生成mybatis的文件,mapper接口相当于我们平常所说 ...