在Java SE5之前,我们要使用枚举类型时,通常会使用static final 定义一组int常量来标识,代码如下

public static final int MAN = 0;
public static final int WOMAN = 1;
  • 12

相信很多小伙伴,在实际开发中也是那么干的,既然这样已经能实现枚举的功能,为什么还要引入枚举呢?我们接着往下看当我们需要是同这组“int枚举”是代码如下

public void showSex(int sex){
switch(sex){
case MAN:
System.out.println("this is a boy");
break;
case WOMAN:
System.out.println("this is a Girl");
break;
}
}
  • 12345678910

看起来这些貌似也没什么问题,但是我们知道,一个项目基本都是基于团队开发,或许只有你自己知道int类型的1代表gril,0代表Boy。其他同事看到这个函数根本不知道其中的含义,这样的代码很明显阅读性很差,从而会造成沟通成本很高。我们接着往下看,现在你为你的func写了很nice的注释,傻子都能看得懂(0 boy,1 gril)。但是项目组不可避免的总会出现那么一两个傻子,非要给你传个3进来,而且这样的错误编译器不会报任何错误,运行时会造成什么bug,这个只有乔老爷知道了。所以这样的代码是极不安全的。使用枚举就能很好的避免上面的问题,接下来我们就来理一理枚举的用法。 
枚举用于存储数量有限的一组固定的数据集。使用场景:上面说到的性别的表示,一年四级春夏秋冬的表示,一周七天的表示,颜色的表示等等。 
枚举的简单用法

 // 普通枚举
public enum ColorEnum {
white, red, green, blue;
} /**
*
* 枚举中有一个自带的静态方法values(),返回enum实例的数据并且该数组中的元素顺序和声明时的顺序一样
* 枚举也可以像普通的类一样可以添加属性和方法,可以为它添加静态和非静态的属性或方法
*/
public enum SeasonEnum {
//注:枚举写在最前面,否则编译出错
spring, summer, autumn, winter; private final static String position = "test"; public static SeasonEnum getSeason() {
if ("test".equals(position))
return spring;
else
return winter;
}
}
/**
* 带构造器的枚举
* 必须带有一个参构造器和一个属性跟方法,否则编译出错
*
*/
public enum Mode {
PULLDOWN("下拉"), PULLUP("上拉");
private final String value; /**
* 构造器默认也只能是private, 从而保证构造函数只能在内部使用
*
*/
private Mode(String value) {
this.value = value;
} public String getValue() {
return value;
}
}
  • 1234567891011121314151617181920212223242526272829303132333435363738394041424344

枚举中还有一个ordinal()方法返回一个int值,这是每个enum实例在声明时的次序,从0开始。枚举类还实现了Compareable接口,所以他具有compareTo()方法。同时还实现了Serializable接口,还自动为你提供了equals()和hashCode()方法。除了不能继承一个枚举类之外,我们基本上可以把枚举类当成一个常规的Java类,可以往其中添加新的方法,包括抽象方法甚至main方法。 
现在我们用枚举来实现上面的那个性别函数

public enum EnumSex {
MAN, WOMAN } public static void showSex(EnumSex EnumSex) {
switch (EnumSex) {
case MAN:
System.out.println("this is a boy");
break;
case WOMAN:
System.out.println("this is a girl");
break;
}
} public static void main(String[] args) {
showSex(EnumSex.MAN);
// showSex(EnumSex.Renyao) 编译报错 }
  • 123456789101112131415161718192021
这样既有很好的阅读性又避免的安全性问题

Java高级特性之枚举的更多相关文章

  1. Java高级特性之枚举学习总结

    在Java SE5之前,我们要使用枚举类型时,通常会使用static final 定义一组int常量来标识,代码如下 public static final int MAN = 0; public s ...

  2. java高级特性增强

    第4天 java高级特性增强 今天内容安排: 1.掌握多线程 2.掌握并发包下的队列 3.了解JMS 4.掌握JVM技术 5.掌握反射和动态代理 java多线程增强 .1. java多线程基本知识 . ...

  3. paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型

    paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...

  4. Java高级特性-String、StringBuffer和StringBuilder

    Java高级特性-String.StringBuffer和StringBuilder String Java语言中的字符串值都属于String类,虽然有其他方法表示字符串(如字符串数组),但Java一 ...

  5. Java高级特性——反射机制(第二篇)

    在Java高级特性——反射机制(第一篇)中,写了很多反射的实例,可能对于Class的了解还是有点迷糊,那么我们试着从内存角度去分析一下. Java内存 从上图可以看出,Java将内存分为堆.栈.方法区 ...

  6. Java高级特性1_流库_初体验

    Java高级特性流库_初体验 面对结果编程 在编程里, 有两种编程方式, 一种是面对过程编程, 一种是面对结果编程. 两者区别如下 面向过程编程 面向过程编程需要编程程序让程序依次执行得到自己想要的结 ...

  7. 云端卫士实战录 | Java高级特性之多线程

    <实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...

  8. Java高级特性之泛型

    首先我们先提出两个问题: 什么是泛型? 为什么要使用泛型?我们先来看看第一个问题什么是泛型.如果你对Java三大特性中的多态性理解的比较透彻的话,泛型就比较好理解了.多态性表示一个对象具备多种状态.比 ...

  9. JAVA 高级特性枚举和泛型

    枚举: 语法:  public enum 枚举名 { 枚举值表(罗列所有值) }  例如:  public enum EnumTest{MON,TUE,WED.THU,FRI,SAT,SUN} 枚举操 ...

随机推荐

  1. OTG驱动分析(一)

    前一段时间弄了2个礼拜的OTG驱动调试,感觉精神疲惫啊.主要原因还是自己对OTG功能不了解造成的.现在终于完成但是对实质原理还有些模糊.所以自己重新总结一下.因为自己是菜鸟,所以用菜鸟的白话方式分析. ...

  2. (二十)java小练习二

    练习4:定义一个整数数组,编写程序求出一个数组的基数和偶数个数 package demo; /*  * 定义一个整数数组,编写程序求出一个数组的基数和偶数个数  */ public class Tes ...

  3. JavaWeb中jsp九大内置对象 和四大作用域

    九大内置对象为 page request response session exception config application out pageContext no 内置对象  类型 1 pag ...

  4. iOS - Mac 常用快捷键

    前言 可以按下组合键来实现通常需要鼠标.触控板或其他输入设备才能完成的操作. 要使用键盘快捷键,需按住一个或多个修饰键,同时按快捷键的最后一个键.例如,要使用快捷键 Command-C(拷贝),请按住 ...

  5. C#图解教程 第九章 语句

    语句 什么是语句控制流语句if语句if-else语句while循环do循环for循环 for语句中变量的作用域初始化和迭代表达式中的多表达式 switch语句 分支示例switch语句补充分支标签 跳 ...

  6. Keras官方中文文档:Keras安装和配置指南(Linux)

    关于计算机的硬件配置说明 推荐配置 如果您是高校学生或者高级研究人员,并且实验室或者个人资金充沛,建议您采用如下配置: 主板:X299型号或Z270型号 CPU: i7-6950X或i7-7700K ...

  7. POJ 1791 Heavy Transportation(最大生成树)

    题面 Background Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand ...

  8. 【洛谷2015】【CJOJ1976】二叉苹果树

    题面 Description 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1.我们用一根树枝两端连 ...

  9. [BZOJ4034] [HAOI2015] T2 (树链剖分)

    Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所 ...

  10. 对html进行截图并保存为本地图片

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...