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

Java -枚举的使用 枚举常量更简单安全。枚举具有内置方法 ,代码更优雅缺点:3. 不可继承,无法扩展,【从构造的方法的私有性就能看出来】1、枚举 将常量组织起来统一进行管理,更简单安全。2、枚举本身就是一个类,其构造方法默认为私有的,且都是默认继承于 java.lang.Enum3、 枚举可以避免反射和序列化问题:枚举类非常安全!4、不可继承,无法扩展。5、枚举具有内置方法 ,代码更优雅。 阅读详情

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

大师兄我又加上自己的理解,来帮助各位理解一下。

用法一:常量

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

Java代码 
  1. public enum Color {  
  2.   RED, GREEN, BLANK, YELLOW  
  3. }  

 

用法二:switch

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

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

 

用法三:向枚举中添加新方法

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

Java代码 
  1. public enum Color {  
  2.     RED("红色", 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.     // 普通方法  
  12.     public static String getName(int index) {  
  13.         for (Color c : Color.values()) {  
  14.             if (c.getIndex() == index) {  
  15.                 return c.name;  
  16.             }  
  17.         }  
  18.         return null;  
  19.     }  
  20.     // get set 方法  
  21.     public String getName() {  
  22.         return name;  
  23.     }  
  24.     public void setName(String name) {  
  25.         this.name = name;  
  26.     }  
  27.     public int getIndex() {  
  28.         return index;  
  29.     }  
  30.     public void setIndex(int index) {  
  31.         this.index = index;  
  32.     }  
  33. }  

 

用法四:覆盖枚举的方法

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

Java代码 
  1. public enum Color {  
  2.     RED("红色", 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.     //覆盖方法  
  12.     @Override  
  13.     public String toString() {  
  14.         return this.index+"_"+this.name;  
  15.     }  
  16. }  

 

用法五:实现接口

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

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

 

用法六:使用接口组织枚举

 Java代码 

  1. public interface Food {  
  2.     enum Coffee implements Food{  
  3.         BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO  
  4.     }  
  5.     enum Dessert implements Food{  
  6.         FRUIT, CAKE, GELATO  
  7.     }  
  8. }  

 

用法七:关于枚举集合的使用

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

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

参考资料:《ThinkingInJava》第四版

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


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

也是因为因为当时刚刚开始学习吧。把平时自以为了解的东西都只是大概了解了一下,说到底,还是自以为了解了,其实转眼就不知道什么是什么了。
出来学习,不习惯看代码怎么能行呢?
下面是我自己的测试代码。


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



然后是测试的结果图:



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

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

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

TYPE type = TYPE.fromTypeName(typeName);
这个方法的返回类型就是这个TYPE枚举类型的。
这下就好理解,这个枚举是怎么在工作了吧

再补充一下:

上面那个带参数的枚举类型的实例里面实际上是三个属性,除了我自定义的typeName以外,还有2个是系统自带的。看下面源码的图:



看到这里之后,不知道你能不能理解下面图片内说明的话:下面图片主要说明在使用枚举时,的规范和标准。希望可以在实际开发时候用到



最后补充一点:

也许你知道呢,但是也许你不知道呢?我是真的不知道,测了之后才知道!!!

枚举类型对象之间的值比较,是可以使用==,直接来比较值,是否相等的,不是必须使用equals方法的哟。

具体,请参考下面的链接:

java 枚举类比较是用==还是equals?



2017.11.07 更新

有的老铁,说这个switch case怎么写,我就在下面再啰嗦一下。

[java]  view plain  copy
  1. private static void testSwitchCase() {  
  2.     String typeName = "f5";  
  3.     //这几行注释呢,你可以试着三选一,测试一下效果。  
  4.     //String typeName = "firewall";  
  5.     //String typeName = "secretMac";  
  6.     TypeEnum typeEnum = TypeEnum.fromTypeName(typeName);  
  7.     if (typeEnum == ) {  
  8.         return;  
  9.     }  
  10.     switch (typeEnum) {  
  11.         case FIREWALL:  
  12.             System.out.println("枚举名称(即默认自带的属性 name 的值)是:" + typeEnum.name());  
  13.             System.out.println("排序值(默认自带的属性 ordinal 的值)是:" + typeEnum.ordinal());  
  14.             System.out.println("枚举的自定义属性 typeName 的值是:" + typeEnum.getTypeName());  
  15.             break;  
  16.         case SECRET:  
  17.             System.out.println("枚举名称(即默认自带的属性 name 的值)是:" + typeEnum.name());  
  18.             System.out.println("排序值(默认自带的属性 ordinal 的值)是:" + typeEnum.ordinal());  
  19.             System.out.println("枚举的自定义属性 typeName 的值是:" + typeEnum.getTypeName());  
  20.             break;  
  21.         case BALANCE:  
  22.             System.out.println("枚举名称(即默认自带的属性 name 的值)是:" + typeEnum.name());  
  23.             System.out.println("排序值(默认自带的属性 ordinal 的值)是:" + typeEnum.ordinal());  
  24.             System.out.println("枚举的自定义属性 typeName 的值是:" + typeEnum.getTypeName());  
  25.             break;  
  26.         default:  
  27.             System.out.println("default");  
  28.     }  
  29. }  

然后,就是运行结果的截图。


老铁们,看完这个枚举,你要懂个概念,那就是,这个枚举,他是个对象,就像你定义的Student类,Person类,等等一些个类一样。

要有这么个概念。只要是个类,他就可以有构造函数,可以有属性,可以有方法。

对的,老铁,你对这个属性,构造函数啥的,有概念吧,没有的话,我可就郁闷啦。

然后,你就看到,这个地方有2个默认的属性,一个是name,一个是ordinal,这2个属性就像你定义Student类和Person类的name和age一样,

只不过,这2个是系统自带的属性,不用你自己去定义啦。

你也可以给这个枚举类,也就是你自己声明的枚举,随便加属性。

我上面代码例子里面的那个TypeEnum那个枚举,就是这么干的,就简单的添加了个自定义属性typeName,

虽然他有自己的name了,那姑且叫我这个自定义的属性叫别名吧。

可以看到,我例子里面就是通过自己写的那个构造方法给我这个自定义的属性初始化值的。

还有,这个构造方法是不可以,也不被运行public的,不信,你可以试试。

还有,你不能对系统自带的name属性,在构造函数里面赋值,没有为什么。

java的枚举enum怎么写,可以定义多个或N个枚举参数的值 java的枚举怎么写 阅读详情

相关推荐

Java面向对象(高级)-- 枚举类的使用

Java面向对象(高级)-- 枚举类的使用

人生得意须尽欢 702

Java 枚举(enum) 六种常用的方法详解

JDK1.5引入了新的类型--枚举,在java中虽然枚举只是一个很小的功能,却给我们带来了很大的方便。 首先我们要了解几个概念,enum是没有构造函数的,准确的来说是没有public类型的构造函数, 它的构造函数只能是private类型的;enum是单例模式;enum中有一个values方法来获取枚举实例对象数组; 说明: MSG_TYPE_SYSTEM是枚举常量,MsgTypeEnum是枚举...

OceanSky的专栏 6万+

【深大算法设计与分析】实验六 最大流应用问题(棒球赛问题) 实验报告 附代码、数据集

【内附代码与数据集】【深大算法设计与分析】实验六 最大流应用问题(棒球赛问题)

m0_74268508的博客 1294

java枚举(enum)使用详解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、枚举类型定义二、访问成员三、遍历四、在switch()中使用枚举五、方法1.内置方法1.1 ordinal()用于返回成员的索引1.2 compareTo()用于比较枚举类型中两个成员的索引值1.3 valueOf()用于返回枚举类型中指定字符串对应的枚举成员,如果不存在则抛出异常1.4 values()方法以数组方式返回枚举类型中的成员2.构造方法3.自定义方法4.重写方法总结 前言 Java中的枚举是一种特殊的类,用于

PiggyRuns的博客 3万+

S4 Hana SD -信贷管理 - 02

在S4版本中,客户的信用管理数据在事务代码BP维护,业务伙伴角色是UKM000。在维护过程中,我们并不能直接输入信贷控制范围这个组织架构,而是需要输入一个信用段,并且在信用段的维度下去维护相应信用管理数据。对于信用段,可以分为主信用段(信用段是0000)和其他临时信用段,我们可以通过配置把次级信用段的客户信贷负债汇总到主信用段。当然,在后台也有配置,会把信用段和信贷控制范围这两者进行关联.3.2SPROIMG > 财务供应链管理 > 信用管理 > 信贷风险监视 > 主数据 > 创建信用段。

weixin_46525734的博客 1968

在Simulink中进行基于模拟信号数字化处理的仿真

模拟信号数字化处理通常包括以下几个步骤:采样、量化、编码以及数字信号处理(如滤波、变换等)。Simulink提供了丰富的模块库,可以方便地实现这些步骤,并支持对整个系统的实时仿真与调试。首先明确你的系统需求,比如输入信号类型(正弦波、方波等)、采样率、需要执行的数字信号处理操作(低通滤波、频谱分析等)。假设我们需要处理一个50Hz的正弦波信号,采样率为1kHz,并希望对该信号进行低通滤波以去除高频噪声。本文介绍了如何在Simulink中进行基于模拟信号数字化处理的仿真。

xiaoheshang_123的博客 627

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

这篇文章主要介绍了Java枚举(enum) 详解7种常见的用法,具有一定的参考价值,有需要的可以了解一下。 JDK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便。  用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且

Kayos博客 1135

S7-200SMART系列全套接线说明

SMART200接线方法,输入,输出,模拟量,面板,扩展糟等,并且详细说明接线原理。

文都龙哥 1万+

Java 枚举(enum) 详解7种常见的用法(转载)

转载:Java 枚举(enum) 详解7种常见的用法 http://blog.youkuaiyun.com/qq_27093465/article/details/52180865 JDK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便。 用法一:常量 用法二:switch 用法三:向枚举中添加新方法 用法六:使用接口组织枚举 用法五:实现接口

menghuanzhiming的博客 647

组态王|组态王通过选择日期实现历史数据的查询

②在弹出的【插入通用控件】对话框选择【Calender Control】控件,然后点击【确定】按钮,关闭对话框,然后在画面上适当的位置按住鼠标左键并拖动,绘制出一个矩形框,放开鼠标,就完成了控件的绘制。此函数将指定的时间格式(年,月,日,时,分,秒)转换为以秒为单位的长整型数,转换的时间基准是UTC(格林尼治)1970年1月1日00:00:00。实现内容,通过两个日历控件选择开始日期和结束日期,然后点击【历史数据查询】按钮,在报表中显示对应时间段的数据集。另外你用过哪些组态软件?

做有价值的事,积累有价值的笔记! 4571

YOLOv11全方位改进指南:卷积层、轻量化、注意力、损失函数等创新优化一览

YOLOv11通过八大核心模块的创新设计,在保持YOLO系列实时性的同时显著提升检测精度。本文提出的可变形卷积DCNv4多模态注意力动态解耦头等创新方案,已在工业质检、自动驾驶、无人机巡检等领域成功应用。完整项目地址预训练模型:包含从nano到x六个规格在线演示创新声明首次在YOLO系列集成DCNv4,小目标检测AP提升8.2%提出多模态混合注意力(MMAttention),兼顾通道与空间关系动态标签分配策略使训练效率提升40%

QQ_778132974的博客 1019

Java 枚举(enum) 7种常见的用法

在JDK1.5引入了新的类型——枚举。在Java中它虽然算个“小”功能,却给我的开发带来了“大”方便。 用法一:常量 在JDK1.5之前,我们定义常量都是:public static final....。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 关键字:enum Java代码 publicenumColor{ RED,GREEN,BLANK,YELLOW }...

WYP123456L的博客 460

实现真正的「人机」对战:引入三方 AI 引擎

引入三方 AI 引擎 前边,我们实现了与云库对战的象棋游戏。这一节中,我们将开始实现真正的「人机」对战 — 人与手机 AI 之间对弈; 实现一套象棋 AI 工程浩大,这个工作我们后续文章会做一番介绍。现代软件工程并不主张每个人都「造轮子」,因此我们要有「站在巨人肩膀上」的小智慧。 本节概要 从 github 寻找开源中象引擎 梳理引擎接入的思路 寻找适合的开源中国象棋引擎 github 上有大...

tosmart的博客 983

Java 枚举(enum) 详解7种常见的用法<详细>

JDK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便。 大师兄我【大师兄】又加上自己的理解,来帮助各位理解一下。 用法一:常量 在JDK1.5 之前,我们定义常量都是: public static final.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 Java代码 public enum Color { RED, GREEN, BLANK, YELLOW } 用法二:swi...

博客 9243

【FastDDS】Discovery ( 01-overview )

Fast DDS 提供了多种发现机制用于自动匹配数据写入器和读取器,包括简单发现(默认兼容RTPS标准)、静态发现(可跳过SEDP阶段)、集中式的发现服务器架构以及手动RTPS发现。发现过程分为参与者发现(PDP)和端点发现(EDP)两个阶段,PDP通过多播/单播公告确认参与者存在,EDP则匹配主题和数据类型相同的端点。系统支持配置发现协议、租约期限等通用参数,以及各机制特有设置如静态EDP XML配置、服务器定位器等。此外还支持通过监听器实现发现回调功能。

Ray Home 722

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: 关于一道简单的Java 基础面试题的剖析: short s1=1;s1 = s1 +1会报错吗?
下一篇: Java程序员面试如何超常发挥?
ole_triangle_java
博客等级 码龄10年 82粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值