Java枚举-程序员宅基地

技术标签: java  


枚举是限定有限可能值的一种手段,使用枚举可以降低程序出错的几率,并可以提高代码的可读性与可维护性。Java中的枚举并不是简单常量的集合,而是一个对象,其本质依然是类,所以Java中的枚举除了提供一系列相关值以外,还提供了一些额外功能,甚至还可以根据需要自行添加一些功能。本文拟就Java枚举的用法做一相对全面的介绍。

一、            常规用法

尽管Java中的枚举是对象,但是大多数使用它的场景与其它语言中并无二致,因此其使用形式也大抵相同。

1.        定义

定义枚举需要使用关键字enum。例如一个应用需要使用一系列特定的颜色值,则可以定义一个类似以下形式的枚举。

enum MyColor

{

    RED,

    BLUE,

    GREEN;

}

2.        使用

枚举定义完成以后,就可以以“枚举名.枚举项”的形式在代码中对定义的枚举进行使用。在特殊情况下,如果程序能够识别出当前的枚举类型,则只需要给出枚举项即可,例如在switch语句块中的case关键字后的常量值。

以下是一段使用枚举的简单示例代码。

MyColor color0 =  MyColor.RED;

switch(color0)

{

case RED:

    System.out.println("红色");

    break;

case BLUE:

    System.out.println("蓝色");

    break;

case GREEN:

    System.out.println("绿色");

    break;

default:

    System.out.println("未知色");

    break;

}

3.        常规方法

Java枚举提供了几个方法供开发者在需要时调用,对于枚举对象,主要可用的方法为values,它返回当前枚举中定义的所有枚举项的集合;对于枚举项,主要可用的方法有ordinal、name和getDeclaringClass。方法ordinal返回枚举项在枚举对象中的序号;方法name则返回枚举项的名称(与方法toString效果相同),通常用于取得枚举变量中保存的枚举项名称;而方法getDeclaringClass则用于取得当前枚举值所在类的完整名称。

此外,枚举项之间还可以通过方法compareTo进行比较,如果参数传入的枚举项与当前值相等,则返回0。

上述枚举定义及使用的完整例程如下:

packagenet.yanzhijun.example;

 

enumMyColor

{

    RED,

    BLUE,

    GREEN;

}

 

publicclass EnumExample

{

    public static void main(String[] args)

    {

        MyColor color0 =  MyColor.RED;

        switch(color0)

        {

        case RED:

            System.out.println("红色");

            break;

        case BLUE:

            System.out.println("蓝色");

            break;

        case GREEN:

            System.out.println("绿色");

            break;

        default:

            System.out.println("未知色");

            break;

        }

         

        for(MyColor myColor: MyColor.values())

        {

            System.out.println(myColor);

            System.out.println(myColor.ordinal());

            System.out.println(myColor.name());

           System.out.println(myColor.getDeclaringClass());  

           System.out.println("============================================");

        }

       

        MyColor color1 = MyColor.valueOf("RED");

        System.out.println(color1);

        System.out.println(color1.ordinal());

        System.out.println(color1.name());

       System.out.println(color1.getDeclaringClass());    

    }        

}

其运行结果如图 1:

运行结果

图 1

 

二、            为枚举添加构造器和成员方法

1.       构造器

类拥有构造器,枚举是一种特殊的类,所以枚举也可以拥有自己的构造器。但与普通类的不同之处在于枚举的构造器不可以是public的,其原因在于该构造器是提供给枚举对象中的枚举项构造时使用的,它并不需要在枚举对象之外使用。

例如,如果希望枚举MyColor中的每个枚举项包含有相应的中文说明以及其对应的Color信息,则可以为MyColor增加一个包含有两个参数的构造器,并且在声明每一个枚举项时使用这个构造器进行构造。其实现代码如下:

enum MyColor

{

    RED("红色",Color.RED),

    BLUE("蓝色",Color.BLUE),

    GREEN("绿色",Color.GREEN);

   

    private String summy;

    private Color color;

   

    private MyColor(Stringsummy, Color color)

    {

        this.summy = summy;

        this.color = color;

    }

}

 

2.       成员方法

如同可以为枚举添加构造器一样也可以为枚举添加方法。例如上述代码中通过构造器为每个枚举项添加了中文说明以及其对应的Color信息,那么为了取出枚举项对应的信息,则需要为枚举MyColor添加如下相应方法。

    public String getSummy()

    {

        return this.summy;

    }

   

    public Color getColor()

    {

        return this.color;

    }

可以看到,通过以上机制,可以将枚举本身要表达的含义与其具体的信息很好地整合起来,杜绝了传统编程语言中含义与信息分离的弊端。

枚举构造器、成员方面及完整的测试代码如下:

packagenet.yanzhijun.example;

 

importjava.awt.Color;

 

enumMyColor

{

    RED("红色", Color.RED),

    BLUE("蓝色",Color.BLUE),

    GREEN("绿色",Color.GREEN);

   

    private String summy;

    private Color color;

   

    private MyColor(String summy, Color color)

    {

        this.summy = summy;

        this.color = color;

    }

   

    public String getSummy()

    {

        return this.summy;

    }

   

    public Color getColor()

    {

        return this.color;

    }

}

 

publicclass EnumExample2

{

    public static void main(String[] args)

    {

        for(MyColor myColor: MyColor.values())

        {

            System.out.println(myColor);

           System.out.println(myColor.getSummy());

           System.out.println(myColor.getColor());       

           System.out.println("==============================");

        }

       

        MyColor color1 =MyColor.valueOf("RED");

        System.out.println(color1);

        System.out.println(color1.getSummy());

       System.out.println(color1.getColor());         

    }        

}

其运行结果如图 2所示。

运行结果

图 2

 

三、            枚举集合

Java中的枚举是一个对象,枚举对象中的各枚举项也是对象。在Java中,集合容器要求存储在其中的每一个成员均是对象类型,而枚举作为一种特殊的类,Java亦专门为枚举提供了集合容器EnumSet和EnumMap。

1.       EnumSet

EnumSet用于保存枚举项的集合,在枚举项本身并不互斥的情况下特别有用。例如,一个应用系统通常会有多种角色,而某些人在系统中可能承担不止一种角色。如果这些角色是通过枚举定义的,则此时EnumSet将可以将多种角色保存在一起,标识特定用户承担的全部角色。

EnumSet扩展于AbstractSet,它除了拥了普通Set所拥有的方法外,主要是增加了一系列可产生EnumSet实例的方法(noneOf、allOf、copyOf、complementOf、of、range等)。

以下是使用EnumSet的of方法产生一个EnumSet实例的示例。

package net.yanzhijun.example;

 

import java.util.EnumSet;

 

enum Role

{

    SYSADMIN,

    ROLEA,

    ROLEC;

}

 

public class EnumSetExample

{

    public static voidmain(String[] args)

    {

        EnumSet<Role> es= EnumSet.of(Role.ROLEA, Role.ROLEB);

        for(Role role: es)

        {

           System.out.println(role);

        }

    }

}

 

2.       EnumMap

EnumMap是必须使用枚举项作为其KEY的Map,其法与普通Map类似。以下例程将两类角色的中文含义置入到一个EnumMap对象中,并随后调用了EnumMap的size和get方法。

packagenet.yanzhijun.example;

        

importjava.util.EnumMap;

        

enum Role

{

    SYSADMIN,

    ROLEA,

    ROLEB,

    ROLEC;

}

        

publicclass EnumMapExample

{

    public static void main(String[] args)

    {

        EnumMap<Role, String> em = newEnumMap<Role, String>(Role.class);

                

        em.put(Role.SYSADMIN, "系统管理员");

        em.put(Role.ROLEA, "角色A");       

                

        System.out.println(em.size());

       System.out.println(em.get(Role.SYSADMIN));

                

    }

}

 

欢迎访问梦断酒醒的博客。


 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34247299/article/details/85575342

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;malloc.h&gt;#include&lt;iostream&gt;#include&lt;stack&gt;#include&lt;queue&gt;using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签