深入掌握Java中的enum
对于要在程序中要表示有限种类的某事物,一般我们可以采用两种方式,一是使用:public static final String 常量;二是使用enum来表示。一般而言前者简单,但是不能够很好的提供更多的信息,而Java中的enum相比而言,却十分的强大,而且更加的专业。
1. 最间C风格的enum:
/**
* 数据源的类别:master/slave
*/
public enum DataSources {
MASTER0, MASTER1, SLAVE0, SLAVE1, SLAVE2, SLAVE2
}
这是最简单的enum, 和C语言中的几乎一样。简单简洁但是功能也很弱。
2. enum 的本质
Java中的enum的本质是一个继承java.lang.Enum的类。所以他就比C风格的enum更加的强大。它可以又属性,方法,构造函数等等,下面看一个例子:
import org.apache.commons.lang.StringUtils;
/**
* 错误码枚举*/
public enum ErrorCodeEnum {
/** 系统异常 */
SYSTEM_ERROR("system_error", "系统异常"),
/** 参数非法 */
ILLEGAL_ARGUMENT("illegal_argument", "参数非法"),
/** 签名非法 */
ILLEGAL_SIGN("illegal_sign", "签名非法"), // ... ...
/** 注册码非法 */
ILLEGAL_REG_CODE("illegal_reg_code", "注册码非法"); /** 枚举码 */
private String code;
/** 枚举描述 */
private String desc; private ErrorCodeEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
public String getDesc() {
return desc;
} /**
* 根据枚举码获取枚举
* @param code 枚举码
* @return 枚举
*/
public static final ErrorCodeEnum getByCode(String code) {
if (StringUtils.isBlank(code)) {
return null;
}
for (ErrorCodeEnum item : ErrorCodeEnum.values()) {
if (StringUtils.equals(item.getCode(), code)) {
return item;
}
}
return null;
}
}
我们看到 ErrorCodeEnum 具有属性 String code 和 String desc,并且具有一个私有的构造函数。原因是我们的枚举常量需要使用这个私有的构造函数的定义:SYSTEM_ERROR("system_error", "系统异常") 就是调用的枚举的私有构造函数:private ErrorCodeEnum(String code, String desc);所以其实ErrorCodeEnum 中定义的枚举常量 SYSTEM_ERROR, ILLEGAL_ARGUMENT 等其实就相当于 ErrorCodeEnum 的一个实例而已,因为它们是调用ErrorCodeEnum 的私有构造函数生成的。而 ErrorCodeEnum 的属性 String code 和 String desc,是为了更好的提供更加详细的错误信息而定义的。而且在枚举ErrorCodeEnum中还可以定义其它的各种辅助方法。
所以枚举的本质是一个继承与java.lang.Enum的类,枚举常量就是枚举的一个个的实例。枚举可以有属性和方法,来强化枚举的功能。枚举一般而言在Java中不是很好理解,一般掌握了枚举背后的本质,那么理解起来就毫无难度了。
3. 枚举的常用方法
public static void main(String[] args){
System.out.println(SYSTEM_ERROR.name());
System.out.println(SYSTEM_ERROR.ordinal());
System.out.println(SYSTEM_ERROR.toString());
for(ErrorCodeEnum e : ErrorCodeEnum.values()){
System.out.println(e.name());
System.out.println(e.getDesc());
}
System.out.println(ErrorCodeEnum.SYSTEM_ERROR.name());
System.out.println(ErrorCodeEnum.valueOf(ErrorCodeEnum.class, "ILLEGAL_ARGUMENT"));
}
String name() : Returns the name of this enum constant, exactly as declared in its enum declaration. 返回枚举常量声明时的字符串。
int ordinal() : 返回枚举常量的声明时的顺序位置,像数组的索引一样,从0开始。
valueOf(Class<T> enumType, String name) : 其实是从 枚举常量的字符串到 枚举常量的转换,相当于一个工厂方法。
name() 方法是从 枚举常量 到 字符串的转换,而 valueOf 是字符串到 枚举常量的转换。
values() : 该方法是一个隐式的方法,All the constants of an enum type can be obtained by calling the implicit public static T[] values() method of that type. 用于遍历枚举中的所有的枚举常量。
4. enum相关的数据结构:EnumMap, EnumSet 具体可以参考jdk文档。
5. enum 相对于 常量的优势(略)
深入掌握Java中的enum的更多相关文章
- 关于Java中枚举Enum的深入剖析
在编程语言中我们,都会接触到枚举类型,通常我们进行有穷的列举来实现一些限定.Java也不例外.Java中的枚举类型为Enum,本文将对枚举进行一些比较深入的剖析. 什么是Enum Enum是自Java ...
- Java中的Enum的使用与分析
使用name()方法和valueOf(String)方法可以在枚举类型对象和字符串之间方便得转换.如果valueOf(String)方法的参数不是该枚举类型合法的字符串,则会抛出IllegalArgu ...
- 如何使用Java中的Enum类
Java1.5 中出现了枚举类型.当一个值都在一个固定的范围内变化,那就可以使用 enum 类型来定义.比如说,一周有七天,一年有四季. 没有枚举类的时候,我们用常量来定义一组范围值的: public ...
- C++和Java中枚举enum的用法
在C++和java中都有枚举enum这个关键字,但是它们之间又不太一样.对于C++来说,枚举是一系列命名了的整型常量,而且从枚举值转化为对应的整型值是在内部进行的.而对于Java来说,枚举更像一个类的 ...
- Java中的Enum枚举类型总结
废话不多说,直接上代码,该例子来源于:http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html public enum Planet { ...
- Java中的enum枚举类
首先说说为什么要写这个enum枚举类吧,是群里有个新手问:怎样把enum类中的值遍历得到,其实自己用的也很少.自己也是确实不知道,于是我去网上搜了不少,总结了些,希望对大家有帮助:首先我说说怎样遍历枚 ...
- JAVA中枚举Enum详解
1.关键字:enum.枚举可以定义成单独的文件,也可以定义在其他类内部. 枚举在类内部的示例: public class EnumInner { public static void main(Str ...
- Java中的enum
package com.st.java; /** * ENUM枚举类型的使用 * @author Administrator * 2016年04月10日 */ public enum MoneyTyp ...
- Java中的Enum(枚举)用法介绍
1. 关于Java Enum:学过C/C++等语言的人,应该都对Enum类型略知一二.Enum一般用来表示一组相同类型的常量.如性别.日期.月份.颜色等.对这些属性用常量的好处是显而易见的,不仅可以保 ...
随机推荐
- 使用自带的JavaScriptSerializer序列化实体 指定的属性如何不序列化
public class GridConfig { public string width = "100%"; public string source = "dataA ...
- CentOS6.5菜鸟之旅:安装SUN JDK1.7和Tomcat7
一.前言 CentOS6.5系统自带Open JDK1.7.1.6和1.5,但OpenJDK部分内容与SUN JDK不兼容,因此打算重新安装SUN JDK1.7来开发. 二.卸载Open JDK ...
- 一个python爬虫小程序
起因 深夜忽然想下载一点电子书来扩充一下kindle,就想起来python学得太浅,什么“装饰器”啊.“多线程”啊都没有学到. 想到廖雪峰大神的python教程很经典.很著名.就想找找有木有pdf版的 ...
- 华为手机Edittext光标(cursor)颜色修改
华为手机的emui系统经常让人发出“可以可以,这很华为”的感叹 这两天在edittext部分也发生了这样的事情 正常edittext光标的颜色和宽度都说可以修改的,只需要通过xml中的 textCur ...
- sprint3冲刺团队贡献分-软件工程
蔡舜 : 20 卢晓洵 : 19 林宇粲 :22 王昕明 :21
- Scrum 3.1 多鱼点餐系统开发进度(第三阶段项目构思与任务规划)
Scrum 3.1 多鱼点餐系统开发进度(第三阶段项目构思与任务规划) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到 ...
- Web控件文本框Reset的功能
在前一篇中<怎样实现Web控件文本框Reset的功能>http://www.cnblogs.com/insus/p/4120889.html Insus.NET只实现了文本框的功能.单个或 ...
- C语言中有bool类型吗?
之前一直都没有注意到,最近在用C语言写DSP算法时,偶然间发现我函数中定义的bool类型的变量在VC6.0(我主要用它来检查一下语法错误)中编译居然报错了,说是bool类型没有定义.用了这么久的C和C ...
- 【jQuery基础学习】12 jQuery学习感想
学习完<锋利的jQuery>,用时13天. 这期间,私底下又用了一点时间去W3C上把HTML和CSS重新过了一遍. 总的来说,收获还是蛮多的. 其实在本书里面真正重要的也就前几章,后面的都 ...
- 基于bootstrap的图片轮播效果展示
<!DOCTYPE html><html lang="zh-CN"> <head> <meta charset="utf-8&q ...