DK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便。

在JDK1.5 之前,我们定义常量都是: public static fianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

Java代码 
  1. public enum Color {
  2. }

JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。

Java代码 
  1. enum Signal {
  2. }
  3. public class TrafficLight {
  4. public void change() {
  5. switch (color) {
  6. case RED:
  7. break;
  8. case YELLOW:
  9. break;
  10. case GREEN:
  11. break;
  12. }
  13. }

如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。

Java代码 
  1. public enum Color {
  2. "红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
  3. // 成员变量
  4. private String name;
  5. private int index;
  6. // 构造方法
  7. private Color(String name, int index) {
  8. this.name = name;
  9. this.index = index;
  10. // 普通方法
  11. public static String getName(int index) {
  12. for (Color c : Color.values()) {
  13. if (c.getIndex() == index) {
  14. return c.name;
  15. }
  16. return null;
  17. // get set 方法
  18. public String getName() {
  19. return name;
  20. public void setName(String name) {
  21. this.name = name;
  22. public int getIndex() {
  23. return index;
  24. public void setIndex(int index) {
  25. this.index = index;
  26. }

下面给出一个toString()方法覆盖的例子。

Java代码 
  1. public enum Color {
  2. "红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
  3. // 成员变量
  4. private String name;
  5. private int index;
  6. // 构造方法
  7. private Color(String name, int index) {
  8. this.name = name;
  9. this.index = index;
  10. //覆盖方法
  11. @Override
  12. public String toString() {
  13. return this.index+"_"+this.name;
  14. }

所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。

Java代码 
  1. public interface Behaviour {
  2. void print();
  3. }
  4. public enum Color implements Behaviour{
  5. "红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
  6. // 成员变量
  7. private String name;
  8. private int index;
  9. // 构造方法
  10. private Color(String name, int index) {
  11. this.name = name;
  12. this.index = index;
  13. //接口方法
  14. @Override
  15. public String getInfo() {
  16. return this.name;
  17. //接口方法
  18. @Override
  19. public void print() {
  20. this.index+":"+this.name);
  21. }

Java代码 

  • public interface Food {
  • enum Coffee implements Food{
  • }
  • enum Dessert implements Food{
  • }
  • }

java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。

关于枚举的实现细节和原理请参考:

参考资料:《ThinkingInJava》第四版

http://softbeta.iteye.com/blog/1185573

我的这篇文章,因为是转载的,可能基本就没有变动,导致被某人踩了一脚。觉得不符合我大师兄的性格。下面我把自己的使用理解给整理一下。

也是因为因为当时刚刚开始学习吧。把平时自以为了解的东西都只是大概了解了一下,说到底,还是自以为了解了,其实转眼就不知道什么是什么了。

出来学习,不习惯看代码怎么能行呢?

下面是我自己的测试代码。

  1. package com.lxk.enumTest;
  2. /**
  3. * Java枚举用法测试
  4. * <p>
  5. * Created by lxk on 2016/12/15
  6. */
  7. public class EnumTest {
  8. public static void main(String[] args) {
  9. forEnum();
  10. useEnumInJava();
  11. }
  12. /**
  13. * 循环枚举,输出ordinal属性;若枚举有内部属性,则也输出。(说的就是我定义的TYPE类型的枚举的typeName属性)
  14. */
  15. private static void forEnum() {
  16. for (SimpleEnum simpleEnum : SimpleEnum.values()) {
  17. System.out.println(simpleEnum + "  ordinal  " + simpleEnum.ordinal());
  18. }
  19. System.out.println("------------------");
  20. for (TYPE type : TYPE.values()) {
  21. System.out.println(type + " " + type.getTypeName() + "  ordinal  " + type.ordinal());
  22. }
  23. }
  24. /**
  25. * 在Java代码使用枚举
  26. */
  27. private static void useEnumInJava() {
  28. String typeName = "f5";
  29. TYPE type = TYPE.fromTypeName(typeName);
  30. if (TYPE.BALANCE.equals(type)) {
  31. System.out.println("根据字符串获得的枚举类型实例跟枚举常量一致");
  32. } else {
  33. System.out.println("大师兄代码错误");
  34. }
  35. }
  36. /**
  37. * 季节枚举(不带参数的枚举常量)这个是最简单的枚举使用实例
  38. * Ordinal 属性,对应的就是排列顺序,从0开始。
  39. */
  40. private enum SimpleEnum {
  41. SPRING,
  42. SUMMER,
  43. AUTUMN,
  44. WINTER
  45. }
  46. /**
  47. * 常用类型(带参数的枚举常量,这个只是在书上不常见,实际使用还是很多的,看懂这个,使用就不是问题啦。)
  48. */
  49. private enum TYPE {
  50. /**
  51. * 防火墙
  52. */
  53. FIREWALL("firewall"),
  54. /**
  55. * 加密机
  56. */
  57. SECRET("secretMac"),
  58. /**
  59. * 负载均衡
  60. */
  61. BALANCE("f5");
  62. private String typeName;
  63. TYPE(String typeName) {
  64. this.typeName = typeName;
  65. }
  66. /**
  67. * 根据类型的名称,返回类型的枚举实例。
  68. *
  69. * @param typeName 类型名称
  70. */
  71. public static TYPE fromTypeName(String typeName) {
  72. for (TYPE type : TYPE.values()) {
  73. if (type.getTypeName().equals(typeName)) {
  74. return type;
  75. }
  76. }
  77. return null;
  78. }
  79. public String getTypeName() {
  80. return this.typeName;
  81. }
  82. }
  83. }



然后是测试的结果图:

简单的例子,大家基本都用过,看不懂的基本都是第二个例子。可以看到,在第二个例子里面,后面带有参数,其实可以这么理解。

enum这个关键字,可以理解为跟class差不多,这也个单独的类。可以看到,上面的例子里面有属性,有构造方法,有getter,也可以有setter,但是一般都是构造传参数。还有其他自定义方法。那么在这些东西前面的,以逗号隔开的,最后以分号结尾的,这部分叫做,这个枚举的实例。也可以理解为,class
 new
出来的实例对象。这下就好理解了。只是,class,new对象,可以自己随便new,想几个就几个,而这个enum关键字,他就不行,他的实例对象,只能在这个enum里面体现。也就是说,他对应的实例是有限的。这也就是枚举的好处了,限制了某些东西的范围,举个栗子:一年四季,只能有春夏秋冬,你要是字符串表示的话,那就海了去了,但是,要用枚举类型的话,你在enum的大括号里面把所有的选项,全列出来,那么这个季节的属性,对应的值,只能在里面挑。不能有其他的。

我上面的例子,就是根据typeName,你可以从那些例子里面挑选到唯一的一个TYPE类型的枚举实例--TYPE.BALANCE。注意方法

TYPE type = TYPE.fromTypeName(typeName);

这个方法的返回类型就是这个TYPE枚举类型的。

这下就好理解,这个枚举是怎么在工作了吧

Java 基础之-枚举的更多相关文章

  1. 【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错

    原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-impor ...

  2. 黑马程序员:Java基础总结----枚举

    黑马程序员:Java基础总结 枚举   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 枚举 为什么要有枚举 问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别 ...

  3. Java基础之枚举类型Enum的使用

    Java基础之枚举类型Enum的使用 定义 public enum AccruedCleanEnum { SPREAD("1","发票"),OTHER(&quo ...

  4. Java基础之枚举

    Java基础之枚举 作为1.5才增加的特性,枚举的使用并不是很多. 枚举其实就是一个比较特殊的类,就如同注解其实也是个特殊的接口一样(注解反编译之后没有了@符号).枚举使用enum关键字声明,通过反编 ...

  5. Java 基础 enum枚举类 的创建/使用/接口继承 ,以及手动创建枚举类的对象为:public static final

    笔记: import java.lang.*; /**一:枚举类 : enum Season implements info { s1(),s2(),s3(),s4() }; //s1--s4 放在S ...

  6. Java基础_枚举类型

    作用:让数据更简洁,更易读,增加代码可读性. 为了用1,2,3,4,5分别表示老师,学生,小组,班主任,后勤,可以直接设置一个变量,让roleType = 1,但这样写代码可读性差. 也可以定义一个成 ...

  7. java基础(十一) 枚举类型

    枚举类型Enum的简介 1.什么是枚举类型 枚举类型: 就是由一组具有名的值的有限集合组成新的类型.(即新的类). 好像还是不懂,别急,咱们先来看一下 为什么要引入枚举类型 在没有引入枚举类型前,当我 ...

  8. Java基础之枚举妙用

    对于枚举,初学Java的时候可能我们就已经接触过了,但是在毕业前,其实一直都不知道真正工作里面枚举是怎么用的,枚举有什么用?接下来,博主就介绍枚举在实际工作中的一种使用场景,本文只适合初级的小菜鸟看哈 ...

  9. java 基础之枚举

    问题:对象的某个属性的值不能是任意的,必须为固定的一组取值其中的某一个 解决办法: 1)  在setGrade方法中做判断,不符合格式要求就抛出异常 2)  直接限定用户的选择,通过自定义类模拟枚举的 ...

随机推荐

  1. 升级python2.7至python3

    首先下载源tar包 可利用linux自带下载工具wget下载,如下所示: 这里我用下载的是Python-3.5.1.tar.bz2版本,下载完成后到下载目录下,解压 进入解压缩后的文件夹 cd  Py ...

  2. Oracle11g导出空表

    # Oracle11g导出空表 <!-- create time: 2015-06-01 23:35:24 --> ###原因 11G中有个新特性,当表无数据时,不分配`segment`, ...

  3. php创建文件并写入信息

    $myfile = fopen("c:\\newfile.txt", "w") or die("Unable to open file!") ...

  4. Java的基本程序设计结构(上)

    在Java中,每一个变量属于一种类型(type).在声明变量时,变量所属的类型位于变量名之前. 例如: double salary; int vacationDays; long earthPopul ...

  5. C#pdf 切割成图片

    引用 using Ghostscript.NET;using Ghostscript.NET.Rasterizer; 需要安装 exe文件 public static GhostscriptVersi ...

  6. 高可用Hadoop平台-Flume NG实战图解篇

    1.概述 今天补充一篇关于Flume的博客,前面在讲解高可用的Hadoop平台的时候遗漏了这篇,本篇博客为大家讲述以下内容: Flume NG简述 单点Flume NG搭建.运行 高可用Flume N ...

  7. DAO实例代码优化

    一般在接口的实现类中不用来实现登陆等功能,在测试类中实现并且测试. package com.beiwo.epet.service.impl; import com.beiwo.epet.dao.Mas ...

  8. zookeeper dubbo 问题解决录

    问题1: 运行起来不报错,不过在Console没有zookeeper的心跳信息,也就是说没有配置上zookeeper,而出错的原因是下面蓝色这段解析不了 spring-dubbo-provider.x ...

  9. Android 之Html的解析(使用jsoup)

    Runnable run=new Runnable() { @Override public void run() { // TODO Auto-generated method stub useri ...

  10. Res_Orders_02

    一.燃尽图展示 二.项目进展 1.实现用户名找回 2.css样式嵌入