Java基础——枚举详解
前言:
在第一次学习面向对象编程时,我记得最深的一句话就是“万物皆对象”。于是我一直秉承着这个思想努力的学习着JAVA,直到学习到枚举(Enum)时,看着它颇为奇怪的语法……我一直在想,这TM是个什么鬼???当时学习OOP时也是被类啊接口什么的整的有点昏头转向的于是就把这个小细节忽略掉了。后来到了公司工作后慢慢的又需要用上枚举了,看着它一副神秘兮兮的样子我还是决定要好好的深挖一下!以下链接是了解枚举时所参考的博客。如发现本文有错误或知识遗漏欢迎在评论中指正!
反编译那些事儿(二)—枚举的反编译:http://blog.csdn.net/gaohuanjie/article/details/18140279
JAVA枚举与常量类的区别:http://blog.csdn.net/tanqian351/article/details/53736628
目录:
1)历史
2)语法解析
3)枚举的好处以及与常量类的区别
4)枚举常用方法
1.历史:
枚举是JDK1.5版本新增的特性(泛型、For-each等如今被广泛应用的特性也是由JDK1.5时所新增的),另外到了JDK1.6后switch语句支持枚举类型。
2.枚举的语法解析:
1.最最最简单版
public enum ColorEnum {
RED,BLUE,GREEN
}
通过工具解析class后获得的源代码(工具参考上面的链接)
public final class ColorEnum extends Enum
{ //返回存储枚举实例的数组的副本。values()方法通常用于foreach循环遍历枚举常量。
public static ColorEnum[] values()
{
return (ColorEnum[])$VALUES.clone();
}
//根据实例名获取实例
public static ColorEnum valueOf(String s)
{
return (ColorEnum)Enum.valueOf(ColorEnum, s);
} //私有构造方法,这里调用了父类的构造方法,其中参数s对应了常量名,参数i代表枚举的一个顺序(这个顺序与枚举的声明顺序对应,用于oridinal()方法返回顺序值)
private ColorEnum(String s, int i)
{
super(s, i);
} //我们定义的枚举在这里声明了三个 ColorEnum的常量对象引用,对象的实例化在static静态块中
public static final ColorEnum RED;
public static final ColorEnum BLUE;
public static final ColorEnum GREEN;
//将所有枚举的实例存放在数组中
private static final ColorEnum $VALUES[]; static
{
RED = new ColorEnum("RED", 0);
BLUE = new ColorEnum("BLUE", 1);
GREEN = new ColorEnum("GREEN", 2);
//将所有枚举的实例存放在数组中
$VALUES = (new ColorEnum[] {
RED, BLUE, GREEN
});
}
}
2.现在我们在枚举类中增加自己的字段以及一些辅助方法,代码如下:
public enum ColorEnum {
RED("red","红色"),GREEN("green","绿色"),BLUE("blue","蓝色");
//防止字段值被修改,增加的字段也统一final表示常量
private final String key;
private final String value; private ColorEnum(String key,String value){
this.key = key;
this.value = value;
}
//根据key获取枚举
public static ColorEnum getEnumByKey(String key){
if(null == key){
return null;
}
for(ColorEnum temp:ColorEnum.values()){
if(temp.getKey().equals(key)){
return temp;
}
}
return null;
}
public String getKey() {
return key;
}
public String getValue() {
return value;
}
}
老规矩,反编译看看变化?(其实也就看看static静态块和构造方法有什么变化就好了)
public final class ColorEnum extends Enum
{ public static ColorEnum[] values()
{
return (ColorEnum[])$VALUES.clone();
} public static ColorEnum valueOf(String s)
{
return (ColorEnum)Enum.valueOf(ColorEnum, s);
} //构造方法在原基础上加上我们新增的两个形参
private ColorEnum(String s, int i, String s1, String s2)
{
super(s, i);
key = s1;
value = s2;
} //自定义方法,通过key值获得对应的枚举对象
public static ColorEnum getEnumByKey(String s)
{
if(null == s)
return null;
ColorEnum acolorenum[] = values();
int i = acolorenum.length;
for(int j = 0; j < i; j++)
{
ColorEnum colorenum = acolorenum[j];
if(colorenum.getKey().equals(s))
return colorenum;
} return null;
} public String getKey()
{
return key;
} public String getValue()
{
return value;
} public static final ColorEnum RED;
public static final ColorEnum GREEN;
public static final ColorEnum BLUE;
//我们自定义的两个字段
private final String key;
private final String value;
private static final ColorEnum $VALUES[]; static
{
RED = new ColorEnum("RED", 0, "red", "\u7EFE\u3223\u58CA");
GREEN = new ColorEnum("GREEN", 1, "green", "\u7F01\u80EF\u58CA");
BLUE = new ColorEnum("BLUE", 2, "blue", "\u9483\u6FCA\u58CA");
$VALUES = (new ColorEnum[] {
RED, GREEN, BLUE
});
}
}
3.枚举的好处以及与常量类的区别
1)枚举型可以直接与数据库打交道,我通常使用varchar类型存储,对应的是枚举的常量名。(数据库中好像也有枚举类型,不过也没用过)
2) switch语句支持枚举型,当switch使用int、String类型时,由于值的不稳定性往往会有越界的现象,对于这个的处理往往只能通过if条件筛选以及default模块来处理。而使用枚举型后,在编译期间限定类型,不允许发生越界的情况
3) 当你使用常量类时,往往得通过equals去判断两者是否相等,使用枚举的话由于常量值地址唯一,可以用==直接对比,性能会有提高
4) 常量类编译时,是直接把常量的值编译到类的二进制代码里,常量的值在升级中变化后,需要重新编译引用常量的类,因为里面存的是旧值。枚举类编译时,没有把常量值编译到代码里,即使常量的值发生变化,也不会影响引用常量的类。
5)枚举类编译后默认为final class,不允许继承可防止被子类修改。常量类可被继承修改、增加字段等,容易导致父类的不兼容。
………………欢迎补充!
总结:常量的定义在开发中是必不可少的,虽然无论是通过常量类定义常量还是枚举定义常量都可以满足常量定义的需求。但个人建议最好是使用枚举类型。
4.枚举常用方法
1.values()获取存储枚举中所有常量实例的数组。常配合foreach完成遍历
for(ColorEnum temp:ColorEnum.values()){
System.out.println(temp);
}
运行结果:
RED
GREEN
BLUE
2.构造方法,枚举的构造方法只能用private修饰符修饰,原因就不需要解释了……
3.valueOf()通过常量名获取对应的枚举实例。
ColorEnum red = ColorEnum.valueOf("RED");
System.out.println(red);
Java基础——枚举详解的更多相关文章
- Java基础数据类型详解
在Java中的数据类型一共有8种,大致分为整型(4个)浮点型(2个)布尔(1)字符(1个) 分类 类型 默认值 占用字节 范围 整型 byte 0 1 = 8 bit -2^7 - 2^7 short ...
- JAVA基础——内部类详解
JAVA内部类详解 在我的另一篇java三大特性的封装中讲到java内部类的简单概要,这里将详细深入了解java内部类的使用和应用. 我们知道内部类可分为以下几种: 成员内部类 静态内部类 方法内部类 ...
- JAVA基础——异常详解
JAVA异常与异常处理详解 一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1 ...
- java基础:数组详解以及应用,评委打分案例实现,数组和随机数综合,附练习案列
1.数组 1.1 数组介绍 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致. 1.2 数组的定义格式 1.2.1 第一种格式 数据类型[] 数组名 示例: int[] arr; ...
- Java基础 - 异常详解
异常的层次结构 Throwable Throwable 是 Java 语言中所有错误与异常的超类. Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示 ...
- 【干货】用大白话聊聊JavaSE — ArrayList 深入剖析和Java基础知识详解(二)
在上一节中,我们简单阐述了Java的一些基础知识,比如多态,接口的实现等. 然后,演示了ArrayList的几个基本方法. ArrayList是一个集合框架,它的底层其实就是一个数组,这一点,官方文档 ...
- java基础(十三)-----详解内部类——Java高级开发必须懂的
可以将一个类的定义放在另一个类的定义内部,这就是内部类. 为什么要使用内部类 为什么要使用内部类?在<Think in java>中有这样一句话:使用内部类最吸引人的原因是:每个内部类都能 ...
- JAVA基础知识详解
1. JVM是什么 JVM是Java Virtual Mechine的缩写.它是一种基于计算设备的规范,是一台虚拟机,即虚构的计算机. JVM屏蔽了具体操作系统平台的信息(显然,就像是我们在电脑上开了 ...
- Java 基础之详解 Java 反射机制
一.什么是 Java 的反射机制? 反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...
随机推荐
- SSH连接GitHub并配置ssh key
SSH连接GitHub并配置ssh key 配置git的ssh提交,主要需要以下三步: 1.设置Git的user name和email 2.生成ssh 3.配置git 的ssh key 一.设置Git ...
- JS_正则表达式_获取指定字符之后指定字符之前的字符串
一个常见的场景,获取:标签背景图片链接: 如字符串:var bgImg = "url(\"https://img30.360buyimg.com/sku/jfs/t26203/26 ...
- 杭电ACM2012--素数判定
素数判定 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- Go中变量作用域的小坑
直接上一实例: package main import "fmt" func main(){ fmt.Println("for start") ; a < ...
- 20190321-HTML基本结构
目录 1.HTML概念 超文本标记语言 2.HTML版本 HTML HTML5 3.HTML基本结构 基本结构 元素.标签.属性 4.HTML常用标签 内容 1.HTML概念 HTML(HyperTe ...
- 基本数据类型 int float str
一.数字型1.整型 int======================================基本使用======================================1.用途 用来 ...
- jsp基础语言-jsp注释
JSP注释可分为客户端注释和服务器端注释. 客户端注释:用户可通过浏览器中的源代码查看,且这种注释可以加入JSP表达式. 语法:<!-- 客户端注释[<%=表达式%>] --> ...
- 浅谈"n个球"和"m个盒子"之间的乱伦关系
无视标题,从我做起 update in 2018.10.1: 补充了"至多为1的四中情况" 这玩意儿的官方名字应该是叫"Twelvefold way",共用12 ...
- npm 安装及使用
1. 安装 npm 安装完node后,就自动完成npm的安装. 2. 常用的npm命令 #安装包 npm install <pkg> 或者 npm install <pkg>@ ...
- 后台返回excel文件流,js下载
/** 下载excel */ downloadExcel(data: Blob): void { var blob = new Blob([data], { type: 'application/vn ...