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. Javaweb命名规则

    一.类命名命名规范:以大写字母开头,如果有多个单词,每个单词头字母大写.例如:StudentInfo 二.接口命名命名规范:以大写字母"I"开头,如果有多个单词,每个单词头字母大写 ...

  2. JavaScript笔记:变量及其作用域

    一.变量的定义及声明 在javascript中变量仅仅是用来保存值的一个占位符而已,定义变量时要使用关键字var后跟一个变量名,如下所示: var message; //定义一个变量message,像 ...

  3. 谈谈React Native环境安装中我遇到的坑

    谈谈React Native环境安装 这个坑把我困了好久,真的是接近崩溃的边缘...整理出来分享给大家,希望遇到跟我一样问题的小伙伴能尽快找到答案. 首先,这是在初始化App之后,react-nati ...

  4. CENTOS 6.4 PPTP VPN 配置

    1. 安装centos 6.4, 具体的步骤有很多的教程,根据菜单提示一步步装也没难点,不细说. 2. 修改网卡的配置: vi /etc/sysconfig/network-scripts/ifcfg ...

  5. 将字母变为其下个字母(abc变为bcd)

    题目描述 输入一行电报文字,将字母变成其下一字母(如'a'变成'b'--'z'变成'a'其它字符不变). 输入 一行字符 输出 加密处理后的字符 样例输入 a b 样例输出 b c#include & ...

  6. 用jquery解析JSON数据的方法以及字符串转换成json的3种方法

    用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...

  7. AngularJS 2 Typescript 相关

    1. Angular 2 In 60 Minutes (2016年11月23日) https://www.youtube.com/watch?v=-zW1zHqsdyc 2. AngularJS Cl ...

  8. AIX 环境下整理文件系统碎块

    IBM AIX v5.3以上版本操作系统环境下基本上不需要对文件系统碎块进行整理,查到AIX里有整理文件系统碎块命令,这里简单提一下. 命令:defragfs例:#defragfs /var defr ...

  9. SQL事务

    一.事务概念    事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是一个不可分割的工作逻辑单元.在数据库系统上执行并发操作时事务是作为最小的 ...

  10. FireBird.conf配置文件常用参数

    1.RootDirectory  "写上Firebird服务器的安装路径" 如果不对FbServer服务是企动会出错的.2.DatabaseAcces 指的是访问Firebird数 ...