Enum介绍及高级使用
Enum 的全称为 enumeration, 是我们较为常用的类,存放在 java.lang 包中。
public enum EnumTest { WALK(1, "慢走"), QUICK(2, "疾步"), RUN(3, "跑步"); private Integer code; private String desc; EnumTest(Integer code, String desc) { this.code = code; this.desc = desc; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } }
可以用if/else、switch来遍历
public static EnumTest getByCode(int code) { for(EnumTest et : EnumTest.values()) { if (et.getCode().intValue() == code) { System.out.println(et.getCode() + "_" + et.ordinal()); return et; } } return null; }
遍历所有定义的value。
ordinal() 方法来得到定义枚举值常量的位置顺序,初始化第一个常量的顺序为0.
enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum。
enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。
但使用枚举,我们需要了解一些注意事项,且可以用枚举来实现怎样的功效?
- 枚举类型带参数,必须要对应匹配的构造方法。
- 可以创建一个enum类,把它看做一个普通的类。除了它不能继承其他类了。
- switch()参数可以使用enum了。
- values()方法是编译器插入到enum定义中的static方法,所以,当你将enum实例向上转型为父类Enum是,values()就不可访问了。解决办法:在Class中有一个getEnumConstants()方法,所以即便Enum接口中没有values()方法,我们仍然可以通过Class对象取得所有的enum实例。
- 无法从enum继承子类,如果需要扩展enum中的元素,在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组。达到将枚举元素进行分组。
- enum允许程序员为eunm实例编写方法。所以可以为每个enum实例赋予各自不同的行为。
- 以职责链(Chain of Responsibility) 的方式来使用枚举,把所有任务定义为枚举值,遍历该枚举依次进行任务处理。
- 使用enum的状态机,然后来动态处理任务。
- 枚举在初始化时,实际会对每个枚举都进行构造实例化。
EnumTest(Integer code, String desc) { System.out.println(code + "_" + desc); this.code = code; this.desc = desc; }
1_慢走
2_疾步
3_跑步
WALK
我们来进行编译以及反编译,看下具体是怎样的内容:
D:\App\src\main\java\com\test>javac EnumTest.java D:\App\src\main\java\com\test>javap EnumTest.class Compiled from "EnumTest.java" public final class com.test.EnumTest extends java.lang.Enum<com.test.EnumTest> { public static final com.test.EnumTest WALK; public static final com.test.EnumTest QUICK; public static final com.test.EnumTest RUN; public static com.test.EnumTest[] values(); public static com.test.EnumTest valueOf(java.lang.String); public static com.test.EnumTest getByCode(int); public java.lang.Integer getCode(); public void setCode(java.lang.Integer); static {}; }
枚举类是继承了Enum,所以枚举类不能再继承其他类。定义的枚举值,在编译之后都会生成静态不可变的枚举对象。
最后来个完整的实例:
public class soundModeDemo { /** * 将用enum枚举去除以下方法中的switch/case */ public void processAlarmEvents(AlarmEvent[] events) { AlarmEvent lastEvent = events[events.length - 1]; byte severity = lastEvent.getAlarmData().getPerceivedSeverity(); switch (lastEvent.getEventType()) { case AlarmEvent.NEW_ALARM: if (severity != PerceivedSeverity.SEVERITY_CLEARED) { System.out.println("playAlarmSound:"+severity); } break; case AlarmEvent.DELETE_ALARM: if (severity == PerceivedSeverity.SEVERITY_CLEARED) { return; } System.out.println("playClearSound:"+severity); break; case AlarmEvent.SEVERITY_CHANGED: byte oldSeverity = lastEvent.getOriginalAlarmData().getPerceivedSeverity(); if ((oldSeverity == PerceivedSeverity.SEVERITY_CLEARED)) { System.out.println("playAlarmSound:"+severity); } else if (severity == PerceivedSeverity.SEVERITY_CLEARED) { System.out.println("playClearSound:"+severity); } break; } }
//带有构造方法的枚举实现
public enum SoundPlay{ NEW_ALARM(AlarmEvent.NEW_ALARM, PerceivedSeverity.SEVERITY_CLEARED, (byte)0), DELETE_ALARM(AlarmEvent.DELETE_ALARM, PerceivedSeverity.SEVERITY_CLEARED, (byte)0), SEVERITY_CHANGED(AlarmEvent.SEVERITY_CHANGED, PerceivedSeverity.SEVERITY_CLEARED, (byte)0); private final byte perceivedSeverity = PerceivedSeverity.SEVERITY_CLEARED; private byte eventType; private byte severity; private byte oldSeverity; public void setSeverity(byte severity) { this.severity = severity; } public void setOldSeverity(byte oldSeverity) { this.oldSeverity = oldSeverity; } Private SoundPlay(byte eventType, byte severity, byte oldSeverity){ this.eventType = eventType; this.severity = severity; this.oldSeverity = oldSeverity; } public void printAllValues() { System.out.println("eventType:"+this.eventType+ " severity:"+this.severity+ " oldSeverity:"+this.oldSeverity); } public void doPlay(){ if(this.eventType == AlarmEvent.NEW_ALARM)playNewAlarm(); if(this.eventType == AlarmEvent.DELETE_ALARM)playDeleteAlarm(); if(this.eventType == AlarmEvent.SEVERITY_CHANGED)playSeverityChange(); } private void playSeverityChange() { if (this.oldSeverity == perceivedSeverity){ System.out.println("playAlarmSound:" + this.oldSeverity); }else if (this.severity == perceivedSeverity){ System.out.println("playClearSound:" + this.severity); } } private void playDeleteAlarm() { if (this.severity == perceivedSeverity){ return; }else{ System.out.println("playClearSound:" + this.severity); } } private void playNewAlarm() { if (this.severity != perceivedSeverity){ System.out.println("playAlarmSound:" + this.severity); } } } public static void main(String[] args) { //每次调用,都需要设置severity或oldSeverity SoundPlay soundPlay1 = SoundPlay.NEW_ALARM; soundPlay1.setSeverity((byte)4); soundPlay1.printAllValues(); soundPlay1.doPlay(); }
}
//最常用标准的枚举方式
public enum SoundPlay{ NEW_ALARM{ @Override public void play(AlarmEvent event) { if (event.getAlarmData().getPerceivedSeverity() != PerceivedSeverity.SEVERITY_CLEARED){ System.out.println("playAlarmSound:" + event.getAlarmData().getPerceivedSeverity()); } } @Override protected byte getType() { return AlarmEvent.NEW_ALARM; } }, DELETE_ALARM{ @Override public void play(AlarmEvent event) { if (event.getAlarmData().getPerceivedSeverity() == PerceivedSeverity.SEVERITY_CLEARED){ return; }else{ System.out.println("playClearSound:" + event.getAlarmData().getPerceivedSeverity()); } } @Override protected byte getType() { return AlarmEvent.DELETE_ALARM; } }, SEVERITY_CHANGED { @Override public void play(AlarmEvent event) { if (event.getAlarmData().getPerceivedSeverity() == PerceivedSeverity.SEVERITY_CLEARED){ System.out.println("playAlarmSound:" + event.getOriginalAlarmData().getPerceivedSeverity()); }else if (event.getAlarmData().getPerceivedSeverity() == PerceivedSeverity.SEVERITY_CLEARED){ System.out.println("playClearSound:" + event.getAlarmData().getPerceivedSeverity()); } } @Override protected byte getType() { return AlarmEvent.DELETE_ALARM; } }, DEFAULT{ @Override public void play(AlarmEvent event) { System.out.println("没有匹配的枚举值内容,调用的默认方法!"); } @Override protected byte getType() { return -1; } }; public abstract void play(AlarmEvent event); protected abstract byte getType(); public static SoundPlay valueOf(byte eventType){ for(SoundPlay soundPlay:SoundPlay.values()){ if(eventType==soundPlay.getType()){ return soundPlay; } } return DEFAULT; } }
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
突破Java面试(23-9) - 深入解析Redis哨兵底层原理
# 0 Github 1 sdown和odown转换机制 两种失败状态 1.1 概念 sdown主观宕机一个哨兵自己觉得一个master宕机 odown客观宕机quorum数量的哨兵都觉得一个master宕机 1.2 达成条件 sdown一个哨兵ping一个master,超过is-master-down-after-milliseconds odown一个哨兵在指定时间内,收到了quorum指定数量的其他哨兵也认为那个master是sdown了,那么就认为是odown 2 自动发现机制 通过Redis的pub/sub实现哨兵互相之间的发现,每个哨兵都会往__sentinel__:hello这个channel发一个消息,此时所有其他哨兵都可消费到该消息,于是感知到其他哨兵的存在. 每隔2s,哨兵都会往自己监控的某个master+slaves对应的__
- 下一篇
Python3入门(四)条件控制
Python 条件语句是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块,if的条件关键字为:if-elif-else a = True if a: print("hello") else: print("no") a为True会执行输出hello,False会执行输出no注意: 1、每个条件后面必须使用:,表示接下来是满足条件后要执行的语句;2、使用缩进来划分语句块,相同缩进的的语句在一起组成一个语句块;3、Python中没有Switch...case语句 一、实例 以下是一些简单的示例 num = int(input("输入一个数字: ")) if num < 0: print("输入的数字小于0") elif num == 0: print("输入的数字等于0") els
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器