1. 枚举类定义

在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象,这种实例有限而且固定的类,在Java里被称为枚举类

2. 早期实现枚举的方式

public static final int SEASON_SPRING = 1;
public static final int SEASON_SUMMER= 2;
public static final int SEASON_FALL = 3;
public static final int SEASON_WINTER = 4;

这种定义季节的方式简单明了,但存在如下几个问题:

1)类型不安全:因为上面的每个季节实际上是一个int整数,因此完全可以把一个季节当成一个int整数使用,例如进行加法运算SEASON_SPRING+SEASON_SUMMER,这种代码完全正常。

2)没有命名空间:当需要使用季节时,必须在SPRING前使用SEASON_前缀,否则程序可能与其它类中的静态常量混淆。

3)打印输出的意义不明确:当输出某个季节时,例如输出SEASON_SPRING,实际上输出的是1,这个1很难猜测出它是代表春天的。

但枚举又确实存在的意义,因此早期也可采用通过定义类的方式来实现,可以采用如下设计方式。

1)通过private将构造器隐藏起来。

2)把这个类的所有可能实例都使用public static final修饰的类变量来保存。

3)如果有必要,可以提供一些静态方法,允许其他程序根据特定参数来获取与之匹配的实例。

4)使用枚举类可以使程序更加健壮,避免创建对象的随意性。

但通过定义类来实现枚举的代码量比较大,实现起来比较麻烦,Java从JDK1.5后就增加了对枚举类的支持。

3. 枚举类详解

Java5新增了一个enum关键字(它与class、interface关键字的地位相同),用以定义枚举类。正如前面看到的,枚举类是一个特殊的类,它一样可以有自己的成员变量、方法,可以实现一个或者多个接口,也可以定义自己的构造器。一个Java源文件中最多只能定义一个public访问权限的枚举类,且该Java源文件也必须和该枚举类的类名相同。

但枚举类终究不是普通的类,它与普通类有如下区别:

1)枚举类不能显示继承其它类,枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是默认继承Object类。其中Enum类实现了Serializable和Comparable两个接口。

2)枚举类不能派生子类,使用enum定义、非抽象的枚举类默认会使用final修饰。

3)枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰。

4)枚举类的实例必须在枚举类的第一行显示列出,否则这个枚举类永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无需程序员显示添加。

枚举类默认提供了一个values()方法,该方法可以很方便的遍历所有枚举值。

下面程序定义了一个SeasonEnum枚举类

public enum SeaonEnum{
//在第一行列出4个枚举实例
SPRING,SUMMER,FALL,WINTER;
}

定义枚举类时必须显示的列出所有的枚举值,枚举值之间使用英文逗号隔开,以英文分号结束。

如果需要使用该枚举类的某个实例,则可以使用类名.变量名的形式,如SeaonEnum.SPRING。

看下面程序实例:

public class EnumTest{
  public void judge(SeasonEnum s)
    //switch语句里的表达式可以是枚举值
    switch(s){
      case SPRING:
      System.out.println("春暖花开,正好踏青");
      break;
    case SUMMER:
      System.out.println("夏日炎炎,适合游泳");
      break;
    case FALL:
      System.out.println("秋高气爽,及时进补");
      break;
    case WINTER:
      System.out.println("冬日飘雪,围炉赏雪");
      break;
    }
  }
  public static void main(String[] args){
    //枚举类默认有一个values()方法,返回该枚举类的所有实例
    for(SeasonEnum s : SeasonEnum.values()){
      System.out.println(s);  
    }
    //使用枚举实例时,可通过EnumClass.variable形式来访问
    new EnumTest().judge(SeasonEnum.SPRING);
  }
}

上面程序测试了SeasonEnum枚举类的用法,该类通过values()方法返回了SeasonEnum枚举类的所有实例,并通过循环迭代输出了SeasonEnum枚举类的所有实例。

由于所有的枚举类都继承了java.lang.Enum类,所以枚举类可以直接使用java.lang.Enum类中所包含的方法。java.lang.Enum类中提供了如下几个方法。

1)int compareTo(E o):比较此枚举与指定对象的顺序。在该对象小于、等于或大于指定对象时,分别返回负整数、零或正整数。 枚举常量只能与相同枚举类型的其他枚举常量进行比较。该方法实现的自然顺序就是声明常量的顺序。

2)String name():返回此枚举常量的名称,在其枚举声明中对其进行声明。 与此方法相比,大多数程序员应该优先考虑使用toString()方法,因为 toString 方法返回更加用户友好的名称。该方法主要设计用于特殊情形,其正确性取决于获取正确的名称,其名称不会随版本的改变而改变。

3) int ordinal():返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。 大多数程序员不会使用此方法。它被设计用于复杂的基于枚举的数据结构,比如 EnumSet 和 EnumMap

4)String toString():返回枚举常量的名称,它包含在声明中。可以重写此方法,虽然一般来说没有必要。当存在更加“程序员友好的”字符串形式时,应该使用枚举类型重写此方法。

5)public static <T extends Enum<T>> T valueOf(Class<T> enumType,String name):返回带指定名称的指定枚举类型的枚举常量。名称必须与在此类型中声明枚举常量所用的标识符完全匹配。(不允许使用额外的空白字符。)

正如前面看到的,当程序使用System.out.println(s)语句来打印枚举值时,实际上输出的是该枚举值得toString()方法,也就是输出该枚举值的名字。

欢迎关注微信公众号【Java典籍】,收看更多Java技术干货!

  ▼微信扫一扫下图↓↓↓二维码关注

 

Java 枚举类详解的更多相关文章

  1. Java 枚举类 详解

    1.枚举是什么? Java中的枚举其实是一种语法糖,在 JDK 1.5之后出现,用来表示固定且有限个的对象.比如一个季节类有春.夏.秋.冬四个对象:一个星期有星期一到星期日七个对象.这些明显都是固定的 ...

  2. Java 枚举(enum) 详解7种常见的用法

    Java 枚举(enum) 详解7种常见的用法 来源 https://blog.csdn.net/qq_27093465/article/details/52180865 JDK1.5引入了新的类型— ...

  3. java枚举使用详解,整理的很好,只能收下。。。

    java枚举使用详解 在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素 ...

  4. Java String类详解

    Java String类详解 Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 类结构: public final ...

  5. C++之enum枚举量声明、定义、使用与枚举类详解

    C++之enum枚举量声明.定义.使用与枚举类详解 学习一个东西,首先应该指导它能做什么,其次去知道它怎么去做,最后知道为什么去这么做. 知其然知其所以然.不能冒进 ,一步一步的慢慢来.

  6. java枚举使用详解

    在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集” ...

  7. java枚举使用详解(转)

    在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的"数 ...

  8. java 枚举使用详解

    在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集” ...

  9. java Random类详解

    java Random类位于java.util包下,主要用来生成随机数,本文详解介绍了Random类的用法,希望能帮到大家 Random类 (java.util) Random类中实现的随机算法是伪随 ...

随机推荐

  1. AJAX from S3 CORS fails on preflight OPTIONS with 403

    解决办法: 将 <!-- Sample policy --> <CORSConfiguration> <CORSRule> <AllowedOrigin> ...

  2. python中读写excel并存入mysql

    为了一个突如其来的想法:用python简单解决就好.现在算是把这个项目需要的基础功能坑都填完了.剩下就是AI和数据展示方面的坑了. 今天遇到的坑是: 1.从excel读出的中文是乱码 2.中文写入my ...

  3. jquery开关按钮效果

    .circular1{ width: 50px; height: 30px; border-radius: 16px; background-color: #ccc; transition: .3s; ...

  4. Asp.Net Core NLog 将日志输出到数据库以及添加LayoutRenderer的支持

    在这之前打算用Apache的Log4Net,但是发现其AdoNetAppender方法已经不存在了,无法使用配置文件直接输出到数据库了,因此我便改用了NLog框架. 一.对项目添加NLog 通过Nug ...

  5. C++中将整型数与字符串型之间的类型转换

    整数转换成字符串类型: 方法一: 这里用到了char *itoa(int value, char *string, int radix); 函数当中参数为:int value 被转换的整数,char ...

  6. CSS实现核辐射警告标志

    今天做了下360的前端星计划测试题,碰到一个有趣的css题,实现如下图效果,记得上次也是在360面试的时候碰到一个有趣的css实现宝马logo,不得不说360的面试题还是很有创意的. 我一直努力想用一 ...

  7. 【双连通分量】Bzoj2730 HNOI2012 矿场搭建

    Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...

  8. gitlab pipelines job执行时日志较大报错

    问题描述 gitlab pipelines job执行时日志较大报错 Job's log exceeded limit of 4194304 bytes. 解决方案 出现该问题主要是因为gitlab ...

  9. C++ bitset用法

    概念: bitset是用来存储位的(其中的元素只有两种形式) 这个类通常用来模拟一个布尔数组,但对空间分配上进行了优化:通常,每个元素只占用一个bit ,而通常char类型是它的八倍 每个位置上的位都 ...

  10. 系统的讲解 - PHP WEB 安全防御

    目录 常见漏洞 SQL注入攻击 XSS攻击 SSRF攻击 CSRF攻击 文件上传漏洞 信息泄露 越权 设计缺陷 小结 常见漏洞 看到上图的漏洞是不是特别熟悉,如果不进行及时防御,就会产生蝴蝶效应. 往 ...