【Java提高】---枚举的应用
枚举
一、枚举和静态常量的区别
讲到枚举我们首先思考,它和public static final String 修饰的常量有什么不同。
我举枚举的两个优点:
1. 保证了类型安全:调用者无法随意传一个 int或者String 等值;
2.代码可读性非常高;
举个例子:
在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如春夏秋冬四个数据元素组成了四季的“数据集”。你写了方法
get(String season),输入的类型只能是String类型,同时要String只能是(春、夏。秋。冬)。
这个时候。你写四个字符串常量
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("小小“),这个时候,在编译期它是不会报错的,只有运行之后,才发现错了。 为了防止上面的隐患,枚举出现了
public enum Season {
SPRING("春"),
SUMMER("夏"),
AUTUMN("秋"),
WINTER("冬");
.....
}
这个时候,我们修改get方法的传参,改成get(Season season) 这个时候加入get(Season.SPRING),这就能保证传入的参数只能是这几个。
二、理解枚举
首要我们要明确,其实枚举也是个class类,我写个枚举来理解。
//我们把枚举当做一个普通类
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运用
先建一个枚举:
public enum Common {
INSERT,
MODIFY,
DELETE
}
//因为这里是无参的对象,所以可以用系统默认的构造函数。也不用写属性和方法。
在写实现代码
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值获取其它值
枚举类
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;
}
}
测试类

好了,就写这么多,以后有需要会更深入了解。
想的太多,做的太少,中间的落差就是烦恼,要么去做,要么别想 少尉【18】
【Java提高】---枚举的应用的更多相关文章
- Java提高篇(三二)-----List总结
前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...
- java提高篇(三十)-----Iterator
迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...
- java提高篇---Iterator
迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...
- Java提高篇(三二)-----List总结
前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点能够对List接口有了比較深的了解了.仅仅有通过归纳总结的知 ...
- Java提高合集(转载)
转载自:http://www.cnblogs.com/pony1223/p/7643842.html Java提高十五:容器元素比较Comparable&Comparator深入分析 JAVA ...
- Java提高篇——对象克隆(复制)
假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...
- Java提高篇(三三)-----Map总结
在前面LZ详细介绍了HashMap.HashTable.TreeMap的实现方法,从数据结构.实现原理.源码分析三个方面进行阐述,对这个三个类应该有了比较清晰的了解,下面LZ就Map做一个简单的总结. ...
- Java提高篇(三一)-----Stack
在Java中Stack类表示后进先出(LIFO)的对象堆栈.栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的.每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出,如下: Stack通过 ...
- java提高篇(二九)-----Vector
在java提高篇(二一)-–ArrayList.java提高篇(二二)-LinkedList,详细讲解了ArrayList.linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现 ...
- Java提高篇(二八)------TreeSet
与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在<Java提高篇(二七)-----TreeMap>中LZ详细讲解了TreeMap实现机制,如果 ...
随机推荐
- 重写JS的鼠标右键点击菜单
重写JS的鼠标右键点击菜单 该效果主要有三点,一是对重写的下拉菜单的隐藏和显示:二是屏蔽默认的鼠标右键事件:三是鼠标左键点击页面下拉菜单隐藏. 不多说,上html代码: 1 <ul id=&qu ...
- qt中线程的使用方法
QT中使用线程可以提高工作效率. 要使用线程要经过一下四个步骤: (1)先创建一个c++ class文件,记得继承Thread,创建步骤如下: a.第一步 b.第二步 (2)自定义一个run函数,以后 ...
- python学习中的一些“坑”
一.交互列表元素时,需要注意的坑. 例如: array=[4,5,9,8,10,8,4,0,3,4] 最大的值与第一个元素交换,最小的值与最后一个元素交换 # -*- coding: UTF-8 - ...
- HBase跨地区机房的压测小程序——从开发到打包部署(图文版)
今天做了一个跨地区机房的压测小程序,主要的思路就是基于事先准备好的rowkey文件,利用多线程模拟并发的rowkey查询,可以实现并发数的自由控制.主要是整个流程下来,遇到了点打包的坑,所以特意记录下 ...
- Python 阿里大于发送手机验证码
1.安装阿里大于的包 pip install top 2.事例脚本 # -*- coding: utf-8 -*- import top.api appkey = '2353xxxx' secret ...
- 深入.NET数据类型(2)
一.装箱和拆箱 将值类型转换为引用类型的过程称为装箱,反之称为拆箱 实际开发尽量避免 装/拆 箱 原因: 装/拆 箱都会降低程序性能 示例代码: static void Main(string[] a ...
- Python入门-数据类型
一.变量 1)变量定义 name = 100(name是变量名 = 号是赋值号100是变量的值) 2)变量赋值 直接赋值 a=1 链式赋值 a=b=c=1 序列解包赋值 a,b,c = 1,2,3 ...
- C#winform程序关闭计算机的正确姿势
/// <summary> /// 计算机电源控制类 /// </summary> public class EnvironmentCheckClass { [DllImpor ...
- [补充资料] 手动搭建 Cloudera 集群
本课主题 集群搭建 设置 Web 服务器 启动 ClouderManager 登入 Cloudera Manager 引言 这部份是一个补充资料,记录如何安装 Cloudera 服务器 集群搭建 查看 ...
- linux中使用Python IDE pycharm教程
今天使用vim编辑Python 并在linux中终端调试的时候,发现每次不是自己想要输出结果的时候,就要用vim编辑代码,再重新回到终端,比较浪费时间.搜索发现pycharm这一个Python ide ...